java - 对话框中的文本丢失

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


}

最佳答案

代码中的问题在于正在执行哪个线程。大多数 Swing 方法只能在名为 Event Dispatch Thread 的非常特定的线程中执行。 。由于您没有正确执行此操作,您的应用程序往往会出现不一致的错误。它越大,就越容易出现问题。

要在 EDT 中正确执行,您需要将 main 方法更改为:

public static void main(String[] args)
{
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run()
        {
            new MainForm();
        }
    });
}

invokeLater 将 MainForm 构造函数的执行调度到 EDT,以便 GUI 初始化代码在正确的线程中执行。

我不知道仅此一项是否可以解决问题,但肯定会解决 future 不可重现的错误行为。我个人在使用 JFileChooser 时也见过一些线程问题,目前或已经报告了该类的线程管理中的一些错误。

请注意,这是 Swing 的核心规则,即使是 Hello world符合。

关于java - 对话框中的文本丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491990/

相关文章:

java - JSCH session 连接问题

java - Spring Boot Maven 构建 application.properties 中随机值的问题

java - 如何将数据从另一个类传递到 GUI?

java - titledBorder 标题中的图标

java - 获取与 COM 端口相关的设备/驱动程序信息?

java - fortify 正在为代码的正确性提供双重检查锁定问题

java - 如何模拟接口(interface) Java PowerMockito

java - 哪些 Eclipse JavaFX 项目文件要上传到 GitHub

java - 如何在 Eclipse 中默认 JUnit 启动配置的工作目录?

java - 在 swing 应用程序中显示网页