Swingutilities.invokeLater и цикл while - PullRequest
0 голосов
/ 02 июля 2019

моя прога использует рамку и панель, которые создаются один раз в цикле. Рамка создается и отображается как обычно, но по какой-то причине панель не создана и / или не отображается.

любые мысли.

веселит.

class GUIThread extends Thread
{
    public boolean threadClose;

    public GUIThread()
    {
        SwingUtilities.invokeLater(this);
    }
    @Override
    public void run()
    {
        JFrame lFrame = null;
        JPanel lPanel = null;
        boolean lFrameFlag = false;

        threadClose =  false;

        while( !threadClose )
        {
            if(lFrameFlag == false)
            {
                lPanel = new JPanel();
                lPanel.setSize(580,356);
                lPanel.setLocation(10,10);
                lPanel.setVisible(true);
                lPanel.setBorder( BorderFactory.createLineBorder(Color.BLACK) );

                lFrame = new JFrame();
                lFrame.setSize(600,400);
                lFrame.setLocation(200,200);
                lFrame.add(lPanel);
                lFrame.setVisible(true);

                lFrameFlag = true;
            }
        }
    }
}

public class GUITestHarness
{
    public static void main(String[] args)
    {
        GUIThread lGUIThread = new GUIThread();
    }
}

при запуске отображается рамка, а на панели нет.

1 Ответ

1 голос
/ 02 июля 2019

Проблема в цикле while. Панель будет отображаться, если выполнение будет продолжено, но поскольку цикл while является бесконечным циклом, кадр никогда не обновляется, поскольку выполнение застряло в цикле.

Так что, если вы попытаетесь без бесконечного цикла, это должно сработать. Как это:

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

//here it's better to implement Runnable than extend Thread
//in this case it's the same, but extending thread can lead to strange problems in other cases
public class Frame implements Runnable {

    public static void main(String[] args) {
        new Frame();
    }

    public Frame() {
        SwingUtilities.invokeLater(this);
    }

    @Override
    public void run() {
        JFrame lFrame = null;
        JPanel lPanel = null;

        lPanel = new JPanel();
        lPanel.setSize(580, 356);
        lPanel.setLocation(10, 10);
        lPanel.setVisible(true);
        lPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        lFrame = new JFrame();
        lFrame.setSize(600, 400);
        lFrame.setLocation(200, 200);
        lFrame.add(lPanel);
        lFrame.setVisible(true);

    }
}
...