1

我使用 windowbuilder 创建了 3 个 GUI 框架,以按此顺序加载和显示。

  • 第一个 GUI (Home.java)
  • 第二个图形用户界面和第三个图形用户界面(Results1.java,Results2.java)

显然 Home.java 可以首先加载,但 2 个正在进行的 GUI 与 Home.java 同时加载。我可以验证它,因为我在初始化 GUI 元素的方法中插入了打印语法。在 Home.java 上按下按钮后,我可以显示最后 2 个 GUI,但内容已经加载。因此,当我需要将变量传递给这 2 个 GUI 时,值变为空。有任何想法吗?

按下 Home.Java 按钮。

//Compare Button
            btnCompare.addActionListener(
                        new ActionListener() {
                        public void actionPerformed(ActionEvent e) {

                            if(lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() != "No File")
                            {

                                    r1.setFileName1(lbl_filecontainer1.getText());
                                    r1.Launch();
                            }
                            else if (lbl_filecontainer1.getText() == "No File" && lbl_filecontainer2.getText() != "No File")
                            {
                                JOptionPane.showMessageDialog(null, "No file 1 selected");
                            }
                            else if (lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() == "No File")
                            {
                                JOptionPane.showMessageDialog(null, "No file 2 selected");
                            }
                            else
                                JOptionPane.showMessageDialog(null, "No files selected");
                            }

                      }
                    );

结果1.java

public class Results1 {

private JFrame frmFileOverall;
String FileName1;

//Instances
Database db = new Database();

/**
 * Launch the application.
 */
public void Launch(String FileName) {
            try {
               setFileName1(FileName);
                Results1 window = new Results1();
                window.frmFileOverall.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }

}

/**
 * Create the application.
 */
public Results1() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmFileOverall = new JFrame();
    frmFileOverall.setResizable(false);
    frmFileOverall.setTitle("File 1 overall result");
    frmFileOverall.setBounds(100, 100, 550, 450);

    JLabel lblNewLabel = new JLabel("Number of words: ");
    lblNewLabel.setFont(new Font("Verdana", Font.BOLD, 11));

    JLabel lblNumberOfSentences = new JLabel("Number of sentences: ");
    lblNumberOfSentences.setFont(new Font("Verdana", Font.BOLD, 11));

    JLabel label_1 = new JLabel("Number of paragraphs: ");
    label_1.setFont(new Font("Verdana", Font.BOLD, 11));

    JTextArea txtAreaFile1 = new JTextArea();
    txtAreaFile1.setEditable(false);

    JLabel wordsContainerFile1 = new JLabel("New label");

    JLabel sentencesContainerFile1 = new JLabel("New label");

    JLabel paragraphsContainerFile1 = new JLabel("New label");
    GroupLayout groupLayout = new GroupLayout(frmFileOverall.getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 124, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(wordsContainerFile1))
                    .addGroup(groupLayout.createSequentialGroup()
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(label_1)
                            .addComponent(lblNumberOfSentences, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(paragraphsContainerFile1)
                            .addComponent(sentencesContainerFile1))))
                .addContainerGap())
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblNewLabel)
                    .addComponent(wordsContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblNumberOfSentences)
                    .addComponent(sentencesContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(label_1)
                    .addComponent(paragraphsContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
                .addContainerGap())
    );
    frmFileOverall.getContentPane().setLayout(groupLayout);
    System.out.print(getFileName1());
    //txtAreaFile1.setText(db.loadFile(getFileName()));
}

public void setFileName1(String fileName)
{
    this.FileName1 = fileName;
}

public String getFileName1()
{
    return this.FileName1;
}


}
4

1 回答 1

3

与其只是在按钮按下时显示一个已经创建的结果 GUI,为什么不只是在按下按钮时才创建结果 GUI,即从 Home JButton 的 ActionListener 调用结果创建代码?所以再次总结一下,关键似乎是您何时以及如何创建结果 GUI,并且您似乎在程序启动时执行此操作,此时您应该响应用户的事件而执行此操作。

请注意,这里的许多人(包括我自己)会建议不要向用户拍摄不同的窗口,而是只使用一个 JFrame 作为 GUI 的视图,并使用CardLayout更改此视图中的 JPanel 。此外,这里的许多人会建议在使用诸如 Window Builder 之类的代码生成工具之前先手动学习编写 Swing GUI 的代码。这样,如果您以后使用它们,您将更好地了解代码生成工具在幕后所做的事情,并使使用它们变得更加容易。


编辑 1
注意,我不确定你的意思是:

已经尝试使用普通类创建 gui。仍然遇到同样的问题。

“使用普通类创建 gui”是什么意思?都是普通班。


编辑 2
您的代码有点精神分裂,因为您有一个 Results1 对象创建一个的Results1 对象,这就是您搞砸的地方。我们称第一个 Results1 对象为 r1A,第二个为 r1B。正如我所看到的,这就是正在发生的事情:

  • r1A 是在用户与 GUI 交互之前在程序创建时创建的。
  • 当用户在您的“主页”GUI 中按下 JButton 时,...
  • r1A 从用户那里获取信息并使用它来设置一个名为 fileName 的字符串。
  • r1A 还创建了一个新的 Results1 对象 r1B。这个新对象不知道文件名字符串。
  • 然后,r1A 告诉 r1B 显示一个 JFrame,frmFileOverall,它再次不知道对 r1A 的文件名字符串所做的任何更改。

我的建议:

  • 创建一个且只有 1 个 Results1 对象,
  • 不是在你正在做的程序创建时,而是在 ActionListener 代码中按下按钮时再次这样做。
  • 给 Results1 一个构造函数 String 参数,这样您就可以将 fileName 传递给它的构造函数
  • 同样,不要让 Results1 创建另一个 Results1 对象。
  • 同样,暂时避免使用任何窗口构建器软件并阅读 Java Swing 教程,因为如果您可以先手动进行此编码,所有这些将成为您的第二天性。

编辑 3
关于您的代码:

if(lbl_filecontainer1.getText() != "No File" && 
    lbl_filecontainer2.getText() != "No File") {
    // ....

您不想使用!=or比较字符串,==因为这将检查一个 String对象是否与另一个 String对象相同,这可能会导致误导性结果。相反,您想知道两个 String 对象是否包含相同的文本,为此您需要使用 String 方法equals(...)equalsIgnoreCase(...)

if(!"No File".equalsIgnoreCase(lbl_filecontainer1.getText()) && 
    !"No File".equalsIgnoreCase(lbl_filecontainer2.getText())) {
    // ....
于 2012-10-15T20:55:54.443 回答