Hallo!
Ich versuche mich seit kurzem mit Swing und bin dabei auf folgendes Problem gestoßen. Das Programm an sich macht nicht viel Sinn, aber ich wollte eigentlich ja auch nur mal Swing im Zusammenhang mit Threading testen: Ich habe mir einige Threads erstelllt, die etwas berechnen und dann einen Event auslösen. Dieser Event soll dann in einem JPanel die Änderung der Hintergrundfarbe bewirken. Das Problem dabei ist, das erst nachdem ich das Fenster in der Größe geändert hab, sich der Hintergrund zu ändern beginnt. Hier mal die Codeschnipsel:
Event class...
Swing class...
Hat jemand einen Tipp? Ich verzweifle so langsam....
Ich versuche mich seit kurzem mit Swing und bin dabei auf folgendes Problem gestoßen. Das Programm an sich macht nicht viel Sinn, aber ich wollte eigentlich ja auch nur mal Swing im Zusammenhang mit Threading testen: Ich habe mir einige Threads erstelllt, die etwas berechnen und dann einen Event auslösen. Dieser Event soll dann in einem JPanel die Änderung der Hintergrundfarbe bewirken. Das Problem dabei ist, das erst nachdem ich das Fenster in der Größe geändert hab, sich der Hintergrund zu ändern beginnt. Hier mal die Codeschnipsel:
Event class...
Code:
// Create the listener list
protected javax.swing.event.EventListenerList listenerList =
new javax.swing.event.EventListenerList();
DisplayEvent dis;
//...
//fire fireDisplayEvent(dis)
//...
// This methods allows classes to register for MyEvents
public synchronized void addDisplayListener(DisplayListener listener) {
listenerList.add(DisplayListener.class, listener);
}
// This methods allows classes to unregister for MyEvents
public synchronized void removeDisplayListener(DisplayListener listener) {
listenerList.remove(DisplayListener.class, listener);
}
// This private class is used to fire MyEvents
void fireDisplayEvent(DisplayEvent evt) {
Object[] listeners = listenerList.getListenerList();
// Each listener occupies two elements - the first is the listener class
// and the second is the listener instance
for (int i=0; i<listeners.length; i+=2) {
if (listeners[i]==DisplayListener.class) {
((DisplayListener)listeners[i+1]).displayEventOccurred(evt);
}
}
}
Swing class...
Code:
@SuppressWarnings("serial")
public class Visualize extends JFrame implements DisplayListener {
VecJPanel pan;
public Visualize() {
super("timestamp demo...");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(600, 400);
pan = new VecJPanel();
add(pan);
}
public void displayEventOccurred(DisplayEvent evt) {
pan.repaint();
}
...
}
@SuppressWarnings("serial")
class VecJPanel extends JPanel {
Color[] colors = {Color.white, Color.black, Color.red,
Color.yellow, Color.blue, Color.cyan, Color.darkGray,
Color.green, Color.magenta, Color.pink};
public void paintComponent(Graphics g) {
super.paintComponent(g);
int i = (int)(Math.random()*10);
setBackground(colors[i]);
}
}
Hat jemand einen Tipp? Ich verzweifle so langsam....