Grafik durch ActionListener herstellen

koddy013

Mitglied
Hallo zusammen,

ich bin neu beim Programmieren und jetzt muss ich mit Java Programmiersprache beschäftigen.
Meine Aufgabe ist eine Programm einer linearen Funktion durch Eingabe von 2 Punkten in eine GUI-Interface zu schreiben.
Dazu habe ich folgende Code geschrieben:


Code:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;

public class LinearApp extends JFrame implements ActionListener {

    JPanel graphPanel;
    JDesktopPane desktop;                                           //main Panel
    JButton drawButton;                                             //Draw Button
    JTextField Inputx1, Inputy1, Inputx2, Inputy2;                  //Eingabe Coordinat
    JLabel labelx1, labely1, labelx2, labely2, labelp1, labelp2;    //Label
    int x1, y1, x2, y2;

    public LinearApp() {

        super("Linear Funktion");

        drawButton = new JButton("Draw");
        drawButton.setBounds(500, 30, 100, 40);
        this.getContentPane().add(drawButton);
        drawButton.addActionListener(this);

        Inputx1 = new JTextField(10);
        Inputx1.setBounds(100, 20, 40, 20);
        this.getContentPane().add(Inputx1);

        labelx1 = new JLabel("x1");
        labelx1.setBounds(80, 20, 20, 20);
        add(labelx1);

        Inputy1 = new JTextField(10);
        Inputy1.setBounds(100, 60, 40, 20);
        this.getContentPane().add(Inputy1);

        labely1 = new JLabel("y1");
        labely1.setBounds(80, 60, 20, 20);
        add(labely1);

        Inputx2 = new JTextField(10);
        Inputx2.setBounds(300, 20, 40, 20);
        this.getContentPane().add(Inputx2);

        labelx2 = new JLabel("x2");
        labelx2.setBounds(280, 20, 20, 20);
        add(labelx2);

        Inputy2 = new JTextField(10);
        Inputy2.setBounds(300, 60, 40, 20);
        this.getContentPane().add(Inputy2);

        labely2 = new JLabel("y2");
        labely2.setBounds(280, 60, 20, 20);
        add(labely2);

        labelp1 = new JLabel("P1");
        labelp1.setBounds(50, 40, 20, 20);
        add(labelp1);

        labelp2 = new JLabel("P2");
        labelp2.setBounds(250, 40, 20, 20);
        add(labelp2);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        graphPanel = new JPanel();
        MyDraw oDraw = new MyDraw();
        graphPanel.add(oDraw);
        graphPanel.setBorder(BorderFactory.createEtchedBorder());
        getContentPane().add(graphPanel, BorderLayout.CENTER);
        
        getContentPane().setLayout(new BorderLayout());

        this.pack();

    }

    public void actionPerformed(ActionEvent e) {

        graphPanel.setVisible(true);
        graphPanel.add(new MyDraw());
        graphPanel.validate();
        graphPanel.repaint();
    }

   
        public static void main(String[] args) {
        LinearApp lin = new LinearApp();
        lin.setSize(800, 600);
        lin.setVisible(true);
        }

public class MyDraw extends JPanel {
                    
            public MyDraw() {
                this.setPreferredSize(new Dimension(320, 100));
                this.setBorder(BorderFactory.createLoweredBevelBorder());
                this.setVisible(true);
                }

        @Override
        public void paint(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;

        AffineTransform transformer = new AffineTransform(1, 0, 0, -1, 0, getHeight());
        transformer.translate(this.getWidth()/2,this.getHeight()/2);

        x1 = (int) Double.parseDouble(Inputx1.getText());
        y1 = (int) Double.parseDouble(Inputy1.getText());
        x2 = (int) Double.parseDouble(Inputx2.getText());
        y2 = (int) Double.parseDouble(Inputy2.getText());

        g2d.setTransform(transformer);
        g2d.drawLine(x1, y1, x2, y2);

        }
    }

}

Durch klicken von "Draw"-Button mit einer ActionListener sollte eigentlich eine Grafik gezeichnet in eine neue Panel, wo in der untere Frame Panel liegt.
Aber ich kann diese Grafik nicht zeichnen.
Weisst ihr wo ich falsch gemacht habe?
Für jede Hilfe bin ich sehr dankbar.

Liebe Grüße
 
Sorry, ich konnte mir das einfach nicht ansehen ohne etwas zu unternehmen.

Java:
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Vorsicht, Baustelle
 * Eltern haften für ihre Kinder
 */

public class LinearApp
{
	private static final long serialVersionUID = 1L;

	public LinearApp()
	{
		super();
		
		JFrame frame = new JFrame();
		frame.setTitle("Linear Funktion");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
    	
		JPanel inputPanel = new JPanel(null);
		inputPanel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
		frame.add(inputPanel);
		
		JPanel graphPanel = new JPanel();
		graphPanel.setBorder(BorderFactory.createEtchedBorder());
		frame.add(graphPanel);
		
		JLabel labelx1 = new JLabel("x1");
		labelx1.setBounds(80, 20, 20, 20);
		inputPanel.add(labelx1);

		JLabel labely1 = new JLabel("y1");
		labely1.setBounds(80, 60, 20, 20);
		inputPanel.add(labely1);

		JLabel labelx2 = new JLabel("x2");
		labelx2.setBounds(280, 20, 20, 20);
		inputPanel.add(labelx2);

		JLabel labely2 = new JLabel("y2");
		labely2.setBounds(280, 60, 20, 20);
		inputPanel.add(labely2);

		JLabel labelp1 = new JLabel("P1");
		labelp1.setBounds(50, 40, 20, 20);
		inputPanel.add(labelp1);

		JLabel labelp2 = new JLabel("P2");
		labelp2.setBounds(250, 40, 20, 20);
		inputPanel.add(labelp2);
		
		JTextField inputX1 = new JTextField();
		inputX1.setBounds(100, 20, 40, 20);
		inputPanel.add(inputX1);
		
		JTextField inputY1 = new JTextField("lol");
		inputY1.setBounds(100, 60, 40, 20);
		inputPanel.add(inputY1);
		
		JTextField inputX2 = new JTextField();
		inputX2.setBounds(300, 20, 40, 20);
		inputPanel.add(inputX2);
		
		JTextField inputY2 = new JTextField();
		inputY2.setBounds(300, 60, 40, 20);
		inputPanel.add(inputY2);
		
		JButton drawButton = new DrawButton(inputX1, inputY1, inputX2, inputY2, frame);
		drawButton.setText("Draw");
		drawButton.setBounds(500, 30, 100, 40);
		inputPanel.add(drawButton);

		frame.setVisible(true);
	}
	public static void main(String[] args)
	{
		new LinearApp();
	}
}
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

class DrawButton extends JButton implements ActionListener
{
	private static final long serialVersionUID = 1L;

	private JTextField inputX1;
	private JTextField inputY1;
	private JTextField inputX2;
	private JTextField inputY2;
	private JFrame frame;
	
	DrawButton(JTextField inputX1, JTextField inputX2, JTextField inputY1, JTextField inputY2, JFrame frame)
	{
		super();
		addActionListener(this);
		
		this.inputX1 = inputX1;
		this.inputY1 = inputY1;
		this.inputX2 = inputX2;
		this.inputY2 = inputY2;
		this.frame = frame;
	}
	public void actionPerformed(ActionEvent e)
	{
		try
		{
			int[] coordinats = new int[4];
			coordinats[0] = Integer.parseInt(inputX1.getText());
			coordinats[1] = Integer.parseInt(inputY1.getText());
			coordinats[2] = Integer.parseInt(inputX2.getText());
			coordinats[3] = Integer.parseInt(inputY2.getText());

			JPanel linePanel = new LinePanel(new Point(coordinats[0], coordinats[1]),
        			new Point(coordinats[2], coordinats[3]));
			linePanel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
			frame.add(linePanel, 0);

			frame.repaint();
		}
		catch (NumberFormatException e1)
		{
			JOptionPane.showMessageDialog(null, "Wrong Input", "", JOptionPane.WARNING_MESSAGE);
		}
	}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

class LinePanel extends JPanel
{
	private static final long serialVersionUID = 1L;

	private Point startCoordinats;
	private Point endCoordinats;
	
	LinePanel(Point startCoordinats, Point endCoordinats)
	{
		setPreferredSize(new Dimension(320, 100));
		setBorder(BorderFactory.createLoweredBevelBorder());
		
		this.startCoordinats = startCoordinats;
		this.endCoordinats = endCoordinats;
	}
	public void paint(Graphics g)
	{
		super.paint(g);
		g.setColor(Color.RED);
		g.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);
	}
}
 
Hallo,

ist es wirklich sinnvoll, bei jedem Button-Klick eine neue Instanz des Panels zu erzeugen und dem Frame hinzuzufügen? Allein aus Performancegründen würde ich lieber eine einzige Instanz des Panels verwenden und sie mit Setter-Methoden für die neuen Koordinaten versehen. Anschließend müsste man in der paint() Methode noch g.clearRect() aufrufen, damit die alten Linien verschwinden.

Grüße
Vincent
 
Erstmal danke für die Antwort.
Jetzt habe ich Probleme beim Zeichen der Koordinatensystem.

Habt ihr Idee, oder habe ihr vielleicht ein Link, wo ich solche Kartesische Koordinatensystem als Referat nachschauen kann?

Danke im voraus für jede Hilfe :)

Liebe Grüße,
 
Zuletzt bearbeitet:
mit dem Koordinatensystem ist es erledigt.

Jetzt muss ich den Grafik oder den Zeichnung in eine neue Frame (InternalFrame) beibringen.
Ich habe den Code nachgerustet mit JInternalFrame und JDesktopPane, aber als ich den DrawButton klicke, passiert ja nichts.

Könnt ihr mir helfen?

Ich bedanke mich im voraus für jede Hilfe.

Liebe Grüße,
 
Folgende ist das GUI Code:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.*;

public class LineareFunktion {

 
    public LineareFunktion()
    {

        super();

        final JFrame frame = new JFrame();
        frame.setTitle("Linear Funktion");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1024, 768);
        frame.setVisible(true);
        frame.setResizable(false);                              //kein Resize möglich

        JPanel inputPanel = new JPanel(null);
        inputPanel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
        inputPanel.setBorder(BorderFactory.createTitledBorder("Linear aus 2 Punkten"));
        frame.add(inputPanel);

        JLabel labelx1 = new JLabel("x1");
        labelx1.setBounds(80, 20, 20, 20);
        inputPanel.add(labelx1);

        JLabel labely1 = new JLabel("y1");
        labely1.setBounds(80, 60, 20, 20);
        inputPanel.add(labely1);

        JLabel labelx2 = new JLabel("x2");
        labelx2.setBounds(280, 20, 20, 20);
        inputPanel.add(labelx2);

        JLabel labely2 = new JLabel("y2");
        labely2.setBounds(280, 60, 20, 20);
        inputPanel.add(labely2);

        JLabel labelp1 = new JLabel("P1");
        labelp1.setBounds(50, 40, 20, 20);
        inputPanel.add(labelp1);

        JLabel labelp2 = new JLabel("P2");
        labelp2.setBounds(250, 40, 20, 20);
        inputPanel.add(labelp2);

        JTextField inputX1 = new JTextField();
        inputX1.setBounds(100, 20, 40, 20);
        inputPanel.add(inputX1);

        JTextField inputY1 = new JTextField();
        inputY1.setBounds(100, 60, 40, 20);
        inputPanel.add(inputY1);

        JTextField inputX2 = new JTextField();
        inputX2.setBounds(300, 20, 40, 20);
        inputPanel.add(inputX2);

        JTextField inputY2 = new JTextField();
        inputY2.setBounds(300, 60, 40, 20);
        inputPanel.add(inputY2);

        JDesktopPane graphPanel = new JDesktopPane();                        //a specialized layered pane
        graphPanel.setBorder(BorderFactory.createTitledBorder("Grafik"));
        graphPanel.setOpaque(true);
        graphPanel.setBounds(0, 100, inputPanel.getWidth(), inputPanel.getHeight());
        inputPanel.add(graphPanel, BorderLayout.CENTER);
        //Make dragging faster:
        graphPanel.putClientProperty("JDesktopPane.dragMode", "outline");

        JInternalFrame internalframe = new JInternalFrame();
        internalframe.setBounds(0, 0, graphPanel.getWidth(), graphPanel.getHeight());
        graphPanel.add(internalframe);

        JButton drawButton = new DrawButton(inputX1, inputY1, inputX2, inputY2, internalframe);
        drawButton.setText("Draw");
        drawButton.setBounds(500, 30, 100, 40);
        inputPanel.add(drawButton);

        JButton printButton = new JButton();
        printButton.setText("Print");
        printButton.setBounds(600, 30, 100, 40);
        inputPanel.add(printButton);

    }

    public static void main(String[] args)
    {
        new LineareFunktion();
    }

}

und dann hier ist die Code von Klasse LinePanel
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;

public class LinePanel extends JInternalFrame
{
    static int openFrameCount = 0;
    static final int xOffset = 30, yOffset = 30;

    Color background = new Color(250,220,150);
	Graphics ksys1;
    int g = 10;
    int k = 50;
    private Point startCoordinats;
    private Point endCoordinats;

    public LinePanel(Point startCoordinats, Point endCoordinats)
    {
        super("Grafik" +(++openFrameCount),
                true,       //resizeable
                true,       //closable
                true,       //maximizable
                true);      //iconifiable
        
        this.startCoordinats = startCoordinats;
        this.endCoordinats = endCoordinats;

        //Set the window's location.
        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
        setPreferredSize(new Dimension(300, 300));
        setBorder(BorderFactory.createLoweredBevelBorder());
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setVisible(true);
        pack();
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;

        AffineTransform transformer = new AffineTransform(1, 0, 0, -1, 0, getHeight());     //transformieren x-y-Richtung
        transformer.translate(this.getWidth()/2,this.getHeight()/2);                        //verschieben die 0 in der Mitte
        g2d.setTransform(transformer);

        g.setColor(Color.RED);                              // Farbe der Linie
        ksys1=g.create(0, 0, 400, 400);                     // Erzeugen der Graphik-Objekte
        ksys1.setClip(-200, -200, 400, 400);                // Die Ränder setzten
        ksys1.setColor(Color.lightGray);                    // Die Zeichenfarbe setzten
        ksys1.fillRect(-200, -200, 400, 400);               // Den Hintergrund zeichnen
        zeichne_ksystem(ksys1);                             // Das Koordinatensystem zeichnen

        g.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen
     }

    private void zeichne_ksystem(Graphics ks) {

		ks.setColor(Color.black);
		ks.drawLine(-200, 0, 200, 0);						// x-Achse
		ks.drawLine(0,-200, 0, 200);						// y-Achse
		for(int j=0, k=0;Math.abs(j)<200;j+=g,k-=g)			// Unterteilungen
			for(int i=0, m=0;Math.abs(i)<200;i+=g,m-=g){
                ks.drawLine(i, j, i, j);
				ks.drawLine(k, m, k, m);
				ks.drawLine(i, k, i, k);
				ks.drawLine(m, j, m, j);
			}

        ks.drawString("(0,0)", 2, -5);

    }
}

Und hier ist von andere Klasse
Java:
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

class DrawButton extends JButton implements ActionListener
{
    
    private JTextField inputX1;
    private JTextField inputY1;
    private JTextField inputX2;
    private JTextField inputY2;
    private JInternalFrame internalframe;
    private JDesktopPane graphPanel;

    public DrawButton(JTextField inputX1, JTextField inputY1, JTextField inputX2, JTextField inputY2, JInternalFrame internalframe)
    {

        super();
        addActionListener(this);
        this.inputX1 = inputX1;
        this.inputY1 = inputY1;
        this.inputX2 = inputX2;
        this.inputY2 = inputY2;
        this.internalframe = internalframe;
    }

    public void actionPerformed(ActionEvent e)
    {

        try
        {

            int[] coordinats = new int[4];
            coordinats[0] = (int) Double.parseDouble(inputX1.getText());
            coordinats[1] = (int) Double.parseDouble(inputY1.getText());
            coordinats[2] = (int) Double.parseDouble(inputX2.getText());
            coordinats[3] = (int) Double.parseDouble(inputY2.getText());

            LinePanel internalframe = new LinePanel(new Point(coordinats[0], coordinats[1]),
            new Point(coordinats[2], coordinats[3]));
            internalframe.setBounds(0, 0, graphPanel.getWidth(), graphPanel.getHeight());
            graphPanel.add(internalframe);
            internalframe.setVisible(true);
            internalframe.repaint();

        }

        catch (NumberFormatException e1)
        {
            JOptionPane.showMessageDialog(null, "Wrong Input", "", JOptionPane.WARNING_MESSAGE);
        }
    }
}

Die GUI ist ja i.O.
Die DesktopPanel ist ja auch da. Aber die InternalFrame wird nicht gezeigt ;(
 
Zuletzt bearbeitet:
Zurück