缺少对话框中的文本

时间:2014-03-18 22:03:45

标签: java eclipse swing

嗨,我有一个java程序。我使用Eclipse作为我的工具。我还安装了Java 7 Update 51,Java SE Development Kit 7 Update 51.我的代码打开用于选择文件的对话框。它可以工作,但问题是对话框上的按钮或文本框上的文本有时会丢失。 enter image description here enter image description here

有人会告诉我如何解决这个问题。提前致谢

有我的代码:

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;
}


}

1 个答案:

答案 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的核心规则。