Feintuning, mal wieder Threading + swing ...

Status
Nicht offen für weitere Antworten.

SuperFamicom

Aktives Mitglied
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:

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-
 

Wildcard

Top Contributor
Was passiert denn wenn du das repaint nicht auskommentierst? Läuft die Schleife auch wirklich in einem separaten Thread?
 

SuperFamicom

Aktives Mitglied
Das nicht-auskommentieren führt zu dem erwähnten Problem: Das Content-Objekt wird im Dialog nicht dargestellt - bzw. seeeeeehr zögerhaft aufgebaut.
Ob die Schleife in einem seperaten Thread läuft? Hm... also wie gesagt, das Objekt, dass die run-Methode enthält ist eine Klasse, die einen Mauscursor animieren soll. Die Schleife ist in der run-Methode. In etwa so:

Code:
public class AnimatedCursor implements Runnable {
    boolean visible = false;
    Thread t = null;

    public void run() {
        while (!stopped) {
            //Berechnung
            owner.repaint();
        }

    public void setVisible(boolean visible) {
        if (visible) {
            t = new Thread(this);
            stopped = false;
            t.start();
        } else {
            if (t != null) {
                stopped = true;
                t.interrupt();
                t = null;
            }
        }

    public final void draw(Graphics g) {
        if (visible) {
            ...
        }
    }
}
AnimatedCursor wird erzeugt von einer Bean, die ich auf das ApplicationFrame gesetzt habe.
 

SuperFamicom

Aktives Mitglied
Hm...
das mag ich nicht ganz glauben. Denn dort steht nur ...

Code:
public final void draw(Graphics g) {
        if (visible) {
            g2D = (Graphics2D) g;
            g2D.setColor(Color.RED);
            dashed = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float [] {8}, phase);
            g2D.setStroke(dashed);
            g2D.drawRect(x - 1, y - 1, width + 2, height + 2);
        }
}

... drin.
 

SuperFamicom

Aktives Mitglied
Code:
@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
        if (owner.getDefaultCursor() != null && owner.getDefaultCursor().isVisible()) {
            owner.getDefaultCursor().draw(g);
        }
        ...
    }

Unspektakulär ^^

Ich habe das Problem suboptimal gelöst. In der while-Schleife habe ich einfach mehr sleep-Zeit für den Thread eingestellt. Die Animation läuft nun nicht mehr so geschmeidig, aber der Dialog wird schneller aufgebaut. Damit muss ich leben.


Danke dir trotzdem!
 
S

SlaterB

Gast
nebenbei eines der wichtigsten Programmierprinzipien, die man lernen kann:


if (owner.getDefaultCursor() != null && owner.getDefaultCursor().isVisible()) {
owner.getDefaultCursor().draw(g);
}

->

Type cursor = owner.getDefaultCursor();
if (cursor != null && cursor.isVisible()) {
cursor.draw(g);
}
 

Wildcard

Top Contributor
Ich denke der teil mit den ... könnte durchaus interessant sein.
Im Zweifelsfall hilft es den Profiler anzuwerfen, denn ich gehe in deinem Fall von einem einfachen Performance Problem aus. Du schaffst es einfach nicht in 9ms neu zu Zeichnen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
C SWT CTabItem wieder sichtbar machen AWT, Swing, JavaFX & SWT 3
C Schon wieder JTable AWT, Swing, JavaFX & SWT 7
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
Z Swing Buttons wieder entfernen vom Bildschirm AWT, Swing, JavaFX & SWT 5
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
Ollek Swing JPnales nach bestimmtenVorgang wieder anzeigen AWT, Swing, JavaFX & SWT 4
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
M AWT Zurücksetzbutton, wieder auf das original Bild AWT, Swing, JavaFX & SWT 3
S ProgressBar newRunnable (schon wieder!) AWT, Swing, JavaFX & SWT 9
M Fenster nach minimierung zum tray wieder öffnen AWT, Swing, JavaFX & SWT 3
E Swing Wieder ein Bild einfügen AWT, Swing, JavaFX & SWT 2
P schon wieder schlange AWT, Swing, JavaFX & SWT 8
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
hdi Swing mal wieder EDT -> nichts passiert AWT, Swing, JavaFX & SWT 20
P JTable...mal wieder AWT, Swing, JavaFX & SWT 7
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
A Wie werde ich beim JTable die Selection wieder los? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
T Mal wieder Swing GUI AWT, Swing, JavaFX & SWT 7
hdi repaint() mag mal wieder nicht. AWT, Swing, JavaFX & SWT 9
T JCheckBox deselektieren (Haken wieder entfernen) - wie? AWT, Swing, JavaFX & SWT 5
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
G wieder mal das leidige thema listener AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2
C JTable. Mal wieder AWT, Swing, JavaFX & SWT 10
T Ich komme mal wieder nicht mit Swing und Image klar. AWT, Swing, JavaFX & SWT 5
G SWT Toolbar: Toolitem entfernen und wieder hinzufügen AWT, Swing, JavaFX & SWT 16
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
V mal wieder das gute alte gridbaglayout AWT, Swing, JavaFX & SWT 4
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
S JScrollPane mal wieder AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
R Mal wieder JTable AWT, Swing, JavaFX & SWT 11
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G mal wieder table. AWT, Swing, JavaFX & SWT 3
X wieder mal ein prob mit dnd AWT, Swing, JavaFX & SWT 14
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
R Anonymen CaretListener wieder entfernen AWT, Swing, JavaFX & SWT 4
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
K Und schon wieder JInternalFrame AWT, Swing, JavaFX & SWT 2
S Wieder eine Frage zu javax.swing.text AWT, Swing, JavaFX & SWT 2
V Swing MVC-Threading AWT, Swing, JavaFX & SWT 11
E SWT Threading und Modifikationen AWT, Swing, JavaFX & SWT 12
M SWT SWT - Threading / Callback AWT, Swing, JavaFX & SWT 3
S SWT Threading ist mir absolut unverständlich! AWT, Swing, JavaFX & SWT 2
J Problem beim Multi-Threading mit einem JDialog AWT, Swing, JavaFX & SWT 2
G Swing Threading Probleme ??? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben