Rechteck in JPanel Zeichnen

Evileye

Mitglied
Hi,
ich soll ein Programm schreiben das, nachdem man auf einen Button geklickt hat, ein Rechteck in ein JPanel zeichnet. Ich habe auch schon einiges, nur verstehe ich nicht ganz wo der Fehler im Quellcode liegt. Das Rechteck wird nach dem Klick nicht gezeichnet.

Hier mal meine Klassen:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GUI {

	JPanel panel;
	JButton button;
	MyPanel myPanel = new MyPanel();
	
	public GUI() {
		JFrame frame = new JFrame("Uebung 4 - Diagramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new FlowLayout(FlowLayout.LEFT));
		frame.setVisible(true);
		
		button = new JButton("Daten anzeigen");
		frame.getContentPane().add(button);
		
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(300,300));
		panel.setBackground(new Color(200,200,255));
		
		JLabel label = new JLabel("Diagramm");
		panel.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel.add(label);
		frame.getContentPane().add(panel);
				
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				button.setForeground(new Color(0,200,0));
				myPanel.setPreferredSize(new Dimension(100,100));
				panel.add(myPanel);
				panel.repaint();
			}
		});	
		
		frame.pack();		
	}

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

Java:
import java.awt.*;
import javax.swing.*;

public class MyPanel extends JComponent {
	
	private static final long serialVersionUID = 1L;

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(new Color(100,100,155));
		g.fillRect(1,1,100,100);
	}
}
 
Hi,

rufe mal anstatt

Code:
panel.repaint();

Code:
panel.validate();
auf, dann sollte es funktionieren!

Gruß
 
Besser:
Java:
panel.revalidate();
Im Konstruktor sollte "frame.setVisible(true);" erst ganz zum Schluß aufgerufen werden.
Die "main" Methode sollte so aussehen:
Java:
public static void main(final String[] args) {
    Runnable gui = new Runnable() {

        public void run() {
            new GUI();
        }
    };
    //GUI must start on EventDispatchThread:
    SwingUtilities.invokeLater(gui);
}
Siehe auch: Initial Threads (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)
 
Habe jetzt jedenfalls schon mal ein Fenster, aber wie ich da drauf jetzt objecte Zeichnen kann null Plan -.-

Java:
import java.awt.*;
import javax.swing.JFrame;
import java.awt.Graphics;
import javax.swing.*;

public class Frame
{
  public static void main( String[] args )
  {
    JFrame   f = new   JFrame  ( "Guillotine" );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 600, 400 );
    Dimension d = Toolkit.getDefaultToolkit().  getScreenSize()  ;
    f.setLocation( (d.width - f.getSize().width ) / 2 , (d.height - f.getSize().height) / 2 );
    f.setVisible( true );
    
  }
}
 
Erstmal eine Einführung: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
und ein Beispiel:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI {
    JPanel panel;
    JButton button;
    MyPanel myPanel = new MyPanel();
    public GUI() {
        JFrame frame = new JFrame("Uebung 4 - Diagramm");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        button = new JButton("Daten anzeigen");
        frame.getContentPane().add(button);
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 300));
        panel.setBackground(new Color(200, 200, 255));
        JLabel label = new JLabel("Diagramm");
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(label);
        frame.getContentPane().add(panel);
        myPanel.setPreferredSize(new Dimension(100, 100));
        panel.add(myPanel);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                button.setForeground(new Color(0, 200, 0));
                myPanel.setDrawOval(true);
                myPanel.repaint();
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new GUI();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class MyPanel extends JComponent {
    private static final long serialVersionUID = 1L;
    private final static Color MY_COLOR1 = new Color(100, 100, 155);
    private boolean drawOval;
    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.setColor(MY_COLOR1);
        g.fillRect(1, 1, 100, 100);
        if(drawOval){
            g.setColor(Color.RED);
            g.fillOval(25, 25, 50, 50);
            g.setColor(Color.BLACK);
            g.drawString("TEST", 35, 55);
        }
    }
    public void setDrawOval(boolean drawOval) {
        this.drawOval = drawOval;
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben