Wie funktioniert JComponent.paintImmediately () - arbeiten in Java-Swing?

Mein Verständnis:
Im Gegensatz zu den meisten Komponenten/Operationen in Swing Aufruf von JComponent.repaint() ist thread-safe, d.h. wenn ein repaint Wunsch aus einem anderen thread (also nicht von EDT), der eigentlichen Malerei geschieht im EDT nur. Unter code-snippet veranschaulicht dies.

public class PaintingDemo {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        final JPanel p = new MyPanel();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.add(p, BorderLayout.CENTER);
                frame.setSize(200, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
        new Thread("MyThread") {
            public void run() {
                while (true) {
                //Below statements are important to show the difference
                    p.repaint();
                    p.paintImmediately(p.getBounds());
                    try {
                        Thread.sleep(1000);
                    } catch(Exception e) {}
                }
            }
        }.start();
    }

}

class MyPanel extends JPanel {
    @Override
    public void paint(Graphics g) {
        System.out.println("paint() called in "+ Thread.currentThread().getName());
        super.paint(g);
    }
}

Aus der Ausgabe es ist bekannt, dass die Malerei erfolgt in EDT, wenn repaint() aufgerufen wird, unabhängig davon, aus welchem thread Sie aufgerufen wird - also keine Probleme. Aber im Fall von paintImmediately() - Malerei geschieht in dem selben thread, aus dem es aufgerufen wird.

Betrachten einen Fall, wo die EDT ist das ändern des Status einer Komponente und einem anderen thread (von denen paintImmediately() aufgerufen wird), ist die Malerei die gleiche Komponente.

Meine Frage:
Im Falle von paintImmediately(), wie ist die Synchronisation zwischen dem Event Dispatcher Thread (EDT) und anderen threads behandelt?

InformationsquelleAutor Learner | 2012-12-25
Schreibe einen Kommentar