Hallo liebe Java-Freunde,
nach gefühlten zwei Kannen Kaffee und 2L Tee komme ich bei einem Problem leider nicht ganz weiter, und hoffe dass ihr mit dabei vielleicht helfen könnt.
Ich stelle zuerst die Frage und danach poste ich noch meinen Quellcode. Macht es wohl zum überblicken einfacher.
Wie kann ich direkt bei einem Mausklick ein JPanel dazu veranlassen, sich komplett mit seinen Komponenten neu zu zeichnen? Bei mir funktioniert es mit repaint irgendwie nicht.
Ich habe extra ein kleines Programm geschrieben, was das Problem verdeutlichen soll.
Ebenfalls bei einem Klick auf den Button soll die komplette JLeinwand neu gezeichnet werden. Doch ich sehe dir Änderung erst, wenn das Fenster in der Größe ändere.
Ich hoffe, mein Problem kommt irgendwie rüber. Wenn nicht, einfach noch einmal fragen.
Nun zu meinem Quellcode.
Main:
Leinwand:
JViereck
nach gefühlten zwei Kannen Kaffee und 2L Tee komme ich bei einem Problem leider nicht ganz weiter, und hoffe dass ihr mit dabei vielleicht helfen könnt.
Ich stelle zuerst die Frage und danach poste ich noch meinen Quellcode. Macht es wohl zum überblicken einfacher.
Wie kann ich direkt bei einem Mausklick ein JPanel dazu veranlassen, sich komplett mit seinen Komponenten neu zu zeichnen? Bei mir funktioniert es mit repaint irgendwie nicht.
Ich habe extra ein kleines Programm geschrieben, was das Problem verdeutlichen soll.
- In der Klasse-JViereck wird einfach nur ein Viereck erstllt und gezeichnet.
- In der Klasse-JLeinwand wird einfach nur eine Liste von JVierecken verwaltet. Bei einem Klick auf den Button wird ein neues Viereck der Liste hinzugefügt.
Ebenfalls bei einem Klick auf den Button soll die komplette JLeinwand neu gezeichnet werden. Doch ich sehe dir Änderung erst, wenn das Fenster in der Größe ändere.
Ich hoffe, mein Problem kommt irgendwie rüber. Wenn nicht, einfach noch einmal fragen.
Nun zu meinem Quellcode.
Main:
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Frame extends JFrame{
/* Instanz-Variablen */
private static final long serialVersionUID = 1L;
private static final int hgap = 5;
private static final int vgap = 5;
private JLeinwand leinwand;
private JButton button;
// --- Konstructor ---
public Frame() {
/* Titel */
setTitle("JLeinwand - Demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* LayoutManager wird geetzt */
getContentPane().setLayout(new BorderLayout(hgap, vgap));
/* Leinwand wird hinzugefügt */
leinwand = new JLeinwand();
add(leinwand, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
/* Applikation wird gestartet */
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Frame();
}
});
}
}
Leinwand:
Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JPanel;
public class JLeinwand extends JPanel{
/* Instanz-Variablen */
private static final long serialVersionUID = 17L;
private static final int hgap = 5;
private static final int vgap = 5;
private JButton button;
/* Liste meiner JVierecke */
private List<JViereck> liste = new ArrayList<JViereck>();
/* Konstruktor */
public JLeinwand() {
setLayout(new GridLayout(0, 5, hgap, vgap));
/* Es werden JVierecke der Liste als auch dem Panel hinzugefügt */
JViereck viereck = null;
for(int i=0; i<5; i++) {
viereck = new JViereck();
liste.add(viereck);
add(viereck);
}
/* BUtton wird hinzugefügt */
button = new JButton("Change");
add(button, BorderLayout.PAGE_END);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
add(new JViereck());
JLeinwand.this.repaint();
}
});
}
}
JViereck
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class JViereck extends JPanel{
private static final long serialVersionUID = 13L;
public JViereck() {}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(0, 0, 10, 10);
}
}