嗨,我有一个java程序。我使用Eclipse作为我的工具。我还安装了Java 7 Update 51,Java SE Development Kit 7 Update 51.我的代码打开用于选择文件的对话框。它可以工作,但问题是对话框上的按钮或文本框上的文本有时会丢失。
有人会告诉我如何解决这个问题。提前致谢
有我的代码:
package MyPackage;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;
import java.io.*;
public class MainForm extends JFrame implements ActionListener {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainForm();
}
public MainForm(){
super("Example");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// Name the JMenu & Add Items
JMenu menu = new JMenu("File");
menu.add(makeMenuItem("Open"));
menu.add(makeMenuItem("Save"));
menu.add(makeMenuItem("Quit"));
// Add JMenu bar
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
setJMenuBar(menuBar);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
//setSize(600, 300);
//setLocation(200, 200);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// Menu item actions
String command = e.getActionCommand();
if (command.equals("Quit")) {
System.exit(0);
} else if (command.equals("Open")) {
// Open menu item action
JFileChooser fileChooser = new JFileChooser();
int returnVal = fileChooser.showOpenDialog(MainForm.this);
if (returnVal == fileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
// Load file
} else if (returnVal == JFileChooser.CANCEL_OPTION ) {
// Do something else
}
}
else if (command.equals("Save")) {
// Save menu item action
System.out.println("Save menu item clicked");
}
}
private JMenuItem makeMenuItem(String name) {
JMenuItem m = new JMenuItem(name);
m.addActionListener(this);
return m;
}
}
答案 0 :(得分:3)
代码中的问题在于执行哪个线程。大多数Swing方法只能在一个名为Event Dispatch Thread的非常特定的线程中执行。因为您没有正确执行此操作,所以您的应用程序往往会出现不一致的错误。它越大越容易出错。
要在EDT中正确执行,您需要将主要方法更改为:
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
new MainForm();
}
});
}
invokeLater
将MainForm构造函数的执行计划到EDT,以便在正确的线程中执行GUI初始化代码。
我不知道这是否会解决这个问题,但肯定会解决未来不可重现的错误行为。我个人在JFileChooser
的其他时间亲眼看到了一些线程问题,这个类的线程管理已经或者有几个报告错误。
请注意,即使Hello world符合,这也是Swing的核心规则。