Java Swing弹出窗口失去焦点而不是重新绘制

时间:2010-08-30 15:46:54

标签: java swing

我有一个带有浏览按钮的简单Java Swing GUI表单。单击时,浏览按钮会创建一个新的JFileChooser。

但是,如果在窗口打开后立即单击“浏览”,则文件选择器窗口似乎松散焦点,显示其后面的父窗口,但它拒绝重新绘制自身。我必须把它拖出屏幕再重新打开,让它恢复正常。

我尝试将代码缩减为仍然存在问题的最简单版本。 (它只是一个非常大的浏览按钮。

public class FormTest extends JFrame
{
    private final int width = 490;
    private final int height = 400;

    private JPanel outerPanel;

    private static FormTest myTest;

    public static void main(String[] args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch( Exception e )
        {
            e.printStackTrace();
        }

        myTest = new FormTest();
        myTest.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        myTest.setResizable(false);
        myTest.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                closeWindow();
            }
        });
        myTest.setVisible(true);
    }

    public FormTest()
    {
        super("Convert Ratings");

        this.setSize(width, height);

        initComponents();
    }

    private void initComponents()
    {
        outerPanel = new JPanel();
        outerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
        outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));

        outerPanel.add(Box.createRigidArea(new Dimension(0, 5)));

        JButton myButton = new JButton("browse");
        myButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                JFileChooser fileChooser = new JFileChooser();

                fileChooser.showOpenDialog(myTest);
            }
        });
        outerPanel.add(myButton);

        this.add(outerPanel);
    }

    private static void closeWindow()
    {
        int result = JOptionPane.showConfirmDialog(myTest, "Are you sure you want to close the application?",
                                                   "Question", JOptionPane.YES_NO_OPTION);

        if( result == JOptionPane.YES_OPTION )
        {
            System.exit(0);
        }
    }
}

在此示例中,必须在窗口打开后立即单击浏览按钮,并在大约10秒后显示错误。

非常感谢任何帮助或建议。

谢谢,

B.J。

2 个答案:

答案 0 :(得分:1)

新增加:

我目前正在使用Mac而我看不到问题,今天晚些时候我会在PC上再试一次。


原帖:

听起来像事件调度线程问题。确保在事件派发线程中执行任何操作GUI的操作。

http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

任何长时间运行的任务都应该使用另一个线程或swing工作来执行它的功能,否则会导致事情停止响应/锁定等等。

答案 1 :(得分:1)

由于你的问题已经改变,我将添加另一个答案。看起来您正在使用CardLayout

您的应用程序无响应可能是由于重新绘制/隐藏/取消隐藏面板的错误逻辑引起的。

这是Oracle关于使用它的教程 http://download.oracle.com/javase/tutorial/uiswing/layout/card.html