Hallo,
ich arbeite seit geraumer Zeit an einer Anwendung. Sie ist noch nicht fertig, aber es ist trotzdem mal Zeit, ein paar Optimierungen vorzunehmen. Insgesamt läuft das Programm schon recht gut. Allerdings machen die JDialogs noch Probleme.
Das Hauptfenster ist abgeleitet von JFrame:
Ausgehend von dieser Klasse werden alle Objekte erzeugt.
Unter anderem ein konstant deklariertes JDialog-Gerüst ( - eins, damit nicht jedes mal immer wieder diese heavyweight-Komponente erzeugt wird - ), dessen Inhalt leer ist und bei Bedarf mit konstanten von JPanel abgeleiteten Objekten gefüllt wird:
Ein solcher Inhalt kann z.B. mit dem in ApplicationFrame konstant deklarierten Objekt über setContent des Dialogs in den Dialog gefüllt werden:
Die Dialoge funktionieren ganz gut und lassen sich flux erzeugen. Allerdings gibt es ein Dialog-Content-Objekt, dass nicht in ApplicationFrame aufgerufen werden kann. Strukturell ist es ähnlich aufgebaut wie obiges Content-Objekt "NewMapDialogContent". Und gerade dieses führt zu einer fehlerhaften Darstellung. Ich vermute, es hat mit falschen Threading zu tun.
Weiter...
Das ApplicationFrame erzeugt eine weitere Bean "XYZ" (swing-abgeleitetes Objekt), die u.a. ein Objekt "O" erzeugt, dass animiert ist - sprich - in einer while-Schleife ständig neu berechnet werden muss und seinen Besitzer XYZ repainted:
"O" implementiert Runnable:
Kommentiert man owner.repaint() aus, so wird der Dialog einwandfrei dargestellt.
Meine Frage, nach der ewigen Vorrede: Swing ist nicht Thread-sicher. Nach langem Ausprobieren habe ich es nicht auf die Reihe bekommen, die Dialoge so laufen zu lassen, wie sie beim auskommentieren der owner.repaint()-Zeile laufen.
How to ..........?
Lässt sich an anderer Stelle durch irgendwelche repaint()-Aufrufe was drehen? - Im Dialog? In den Dialog-Content-Objekten? In dem ApplicationFrame? Oder gar mit Layout-Managern?
Wäre schön, wenn wer helfen könnte
-Viele Grüße-
ich arbeite seit geraumer Zeit an einer Anwendung. Sie ist noch nicht fertig, aber es ist trotzdem mal Zeit, ein paar Optimierungen vorzunehmen. Insgesamt läuft das Programm schon recht gut. Allerdings machen die JDialogs noch Probleme.
Das Hauptfenster ist abgeleitet von JFrame:
Code:
public class ApplicationFrame extends javax.swing.JFrame {
// Konstruktor, Methoden, etc.
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ApplicationFrame().setVisible(true);
}
});
}
}
Ausgehend von dieser Klasse werden alle Objekte erzeugt.
Unter anderem ein konstant deklariertes JDialog-Gerüst ( - eins, damit nicht jedes mal immer wieder diese heavyweight-Komponente erzeugt wird - ), dessen Inhalt leer ist und bei Bedarf mit konstanten von JPanel abgeleiteten Objekten gefüllt wird:
Code:
public class JFrameworkDialog extends javax.swing.JDialog {
public JFrameworkDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
public final void setContent(javax.swing.JPanel content, String title) {
setLayout(new FlowLayout(FlowLayout.LEFT, 4, 4));
getContentPane().add(content);
setTitle(title);
pack();
}
public final void deleteContent() {
getContentPane().removeAll();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFrameworkDialog dialog = new JFrameworkDialog(new pool.PlaygroundFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
}
Ein solcher Inhalt kann z.B. mit dem in ApplicationFrame konstant deklarierten Objekt über setContent des Dialogs in den Dialog gefüllt werden:
Code:
public class NewMapDialogContent extends javax.swing.JPanel {
private JFrameworkDialog parent = null;
public NewMapDialogContent(JFrameworkDialog parent) {
this.parent = parent;
initComponents();
}
private void createNewMap(java.awt.event.ActionEvent evt) {
((pool.ApplicationFrame) parent.getParent()).setMap(new pool.nonBeans.Map(Integer.parseInt(jSpinner1.getValue().toString()), Integer.parseInt(jSpinner2.getValue().toString()), jTextField1.getText()));
parent.deleteContent();
parent.dispose();
}
private void cancelDialog(java.awt.event.ActionEvent evt) {
parent.deleteContent();
parent.dispose();
}
}
Die Dialoge funktionieren ganz gut und lassen sich flux erzeugen. Allerdings gibt es ein Dialog-Content-Objekt, dass nicht in ApplicationFrame aufgerufen werden kann. Strukturell ist es ähnlich aufgebaut wie obiges Content-Objekt "NewMapDialogContent". Und gerade dieses führt zu einer fehlerhaften Darstellung. Ich vermute, es hat mit falschen Threading zu tun.
Weiter...
Das ApplicationFrame erzeugt eine weitere Bean "XYZ" (swing-abgeleitetes Objekt), die u.a. ein Objekt "O" erzeugt, dass animiert ist - sprich - in einer while-Schleife ständig neu berechnet werden muss und seinen Besitzer XYZ repainted:
"O" implementiert Runnable:
Code:
public void run() {
while (!stopped) {
...
owner.repaint(); // owner ist "XYZ"
try {
Thread.sleep(9);
} catch (InterruptedException ex) {}
}
}
Kommentiert man owner.repaint() aus, so wird der Dialog einwandfrei dargestellt.
Meine Frage, nach der ewigen Vorrede: Swing ist nicht Thread-sicher. Nach langem Ausprobieren habe ich es nicht auf die Reihe bekommen, die Dialoge so laufen zu lassen, wie sie beim auskommentieren der owner.repaint()-Zeile laufen.
How to ..........?
Lässt sich an anderer Stelle durch irgendwelche repaint()-Aufrufe was drehen? - Im Dialog? In den Dialog-Content-Objekten? In dem ApplicationFrame? Oder gar mit Layout-Managern?
Wäre schön, wenn wer helfen könnte
-Viele Grüße-