複数ユーザーのペイント プログラムのプロジェクトに取り組んでいますが、GUI がロックするという問題が発生しました。
このエラーを除いて、ほとんどのプログラムを実行しました。これはかなり大きなプログラムなので、小さなプログラムでエラーを再現しようとしました。
この小さなプログラムには、2 つの JFrame があります。どちらも、マウスをクリックしてドラッグすることで描画できます。セカンダリ JFrame は、10 秒間スリープしてから、描画したものを別のフレームに送信して表示するスレッドです。
ただし、メイン フレームがセカンダリ フレームからイメージを受信すると、GUI がロックされ、メイン フレームを描画できなくなります。
私は現在、 SwingUtilities.invokeLater() メソッドを使用して作業しています。答えを探しているときに SwingWorker クラスを見つけましたが、SwingWorker で動作するようにコードを大幅に書き直す前に、簡単な解決策があるかどうかを確認したかったのです。
読んでくれてありがとう。私のコードは以下です。また、こちらに投稿するのは初めてです。コードの整形に手こずったようで、間違っていたらお詫びします。私はそれを修正するために最善を尽くします。
package gui_thread_test;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JComponent;
public class DrawPanel extends JComponent
{
    private Image canvas;
    private int x, y, prevX, prevY;
    Graphics2D g2;
    public DrawPanel()
    {
        setDoubleBuffered(false);
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent e )
            {
                prevX = e.getX();
                prevY = e.getY();
            }
        });
        addMouseMotionListener(new MouseMotionAdapter()
        {
            @Override
            public void mouseDragged(MouseEvent e)
            {
                x = e.getX();
                y = e.getY();
                g2.drawLine(prevX, prevY, x, y);
                repaint();
                prevX = x;
                prevY = y;
            }
        });
    }
    @Override
    public void paintComponent(Graphics g)
    {
        if (canvas == null)
        {
            canvas = createImage(getSize().width, getSize().height);
            g2 = (Graphics2D) canvas.getGraphics();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        }
        g.drawImage(canvas, 0, 0, null);
    }
    public synchronized void updateCanvas(Image _canvas)
    {
        canvas = _canvas;
        repaint();
    }
    public Image getImage()
    {
        return canvas;
    }
}
-
package gui_thread_test;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class ThreadTest extends JFrame implements Runnable
{
    private Image canvas;
    private Graphics2D g2;
    private DrawPanel panel;
    private DrawPanel threadPanel;
    public ThreadTest(DrawPanel _panel)
    {
        super("Secondary");
        panel = _panel;
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setPreferredSize(new Dimension(500,500));
        this.setMinimumSize(new Dimension(500,500));
        this.setVisible(true);
        threadPanel = new DrawPanel();
        this.add(threadPanel);
    }
    public void paintComponent(Graphics g)
    {
        if (canvas == null)
        {
            canvas = createImage(getSize().width, getSize().height);
            g2 = (Graphics2D) canvas.getGraphics();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        }
        g.drawImage(canvas, 0, 0, null);        
    }
    @Override
    public void run() {
        //Sleep thread for 10 seconds to give time to draw on the image
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ThreadTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        SwingUtilities.invokeLater(
                new Runnable() {
                    @Override
                    public void run() {
                        //Posts the message to the server chat window
                        panel.updateCanvas(threadPanel.getImage());
                    }
                });
    }
}
-
package gui_thread_test;
import java.awt.Dimension;
import javax.swing.JFrame;
public class GUI_Thread_Test {
    public static void main(String[] args) 
    {
        JFrame window = new JFrame("Main");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setPreferredSize(new Dimension(500,500));
        window.setMinimumSize(new Dimension(500,500));
        DrawPanel draw = new DrawPanel();
        window.add(draw);
        Thread testThread = new Thread(new ThreadTest(draw));
        testThread.start();
        window.pack();
        window.setVisible(true);
    }
}