我有一个带有浏览按钮的简单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。
答案 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