【问题标题】:The text in dialog box is missing对话框中的文本丢失
【发布时间】:2014-03-18 22:03:44
【问题描述】:

您好,我有一个 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;
}


}

【问题讨论】:

  • 小注:您使用的是 Java 7,它可以打开字符串。使用其中之一,您的 actionPerformed 看起来会非常漂亮。 :-)
  • @captainroxors 我是 Java 新手。我不明白“打开字符串”。你能给我一个例子或网络,所以我可以了解更多。谢谢。
  • 你的操作系统是什么?无法在我的机器上重现该问题。您的代码看起来不错。
  • @captainroxors 我使用 VM 来创建具有 4096 内存的 Windows 7 的问题。

标签: java eclipse swing


【解决方案1】:

代码中的一个问题是正在执行哪个线程。大多数 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 初始化代码。

我不知道仅此一项是否能解决问题,但肯定会解决未来不可重现的错误行为。我个人曾在其他时候看到过JFileChooser 的一些线程问题,这个类的线程管理存在或已经报告了几个错误。

请注意,这是 Swing 的核心规则,即使 Hello world 也遵守。

【讨论】:

  • 我给你 +1 只是为了一个好的建议。但在我的电脑上,他的代码运行良好。所以这不是一个真正的问题。
  • @brano 在我的电脑上也能正常工作,但他说错误“有时”会发生,所以这可能是他的机器的原因。
  • 但是actionPerformed 是在事件调度线程的上下文中执行的,所以虽然这是个好建议,但不一定是答案...
  • @DSquare 我添加了您的代码,但问题仍然存在。我会将您的代码保留在那里以防止将来出现问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
相关资源
最近更新 更多