java - 如何重新打开使用类创建的同一表单

标签 java scope switch-statement

类跟踪器设置为 Hide_on_Close,这就是创建我的表单的原因。 我有一个开关,如果从未打开过该表单,我会尝试首先打开该表单,然后在第二次调用该开关时重新显示相同的表单及其上的所有数据。

我刚刚学习编码,但不知道如何重新打开相同的表单。我可以打开它的一个新实例,但所有数据都消失了。

    `public class Zoner extends JFrame {

  public JTextPane pane;

  public JMenuBar menuBar;

  public JToolBar toolBar;   
  Tracker tracker1 = null;

`Globals.comboBox.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
    switch (i){
              case 0 : 
                  if(tracker1 == null) {
            tracker1 = new Tracker();
        } else {
             JOptionPane.showMessageDialog(null, "Same form");         
            tracker1.setVisible(true);
        }



              break;

The code for Class Tracker is as follows... Removed all the swing ui stuff..

    class Tracker {
    private Integer wHitCounter = 0 ;
    private Integer COCCounter = 0 ;
    private JFrame frame1;
    public Tracker()
    {
// Create form
     Object choice =(Globals.comboBox )
                      .getSelectedItem();
    JFrame frame = new JFrame("Zoner: " + choice);
     frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
     frame.setSize(1024,850);
     Container contentPane = frame.getContentPane();
     //Set up Gui form

    SpringLayout layout = new SpringLayout();
    contentPane.setLayout(layout);
pack();
    frame.setVisible(true);
    }
    public void setVisible(boolean bool) {
        frame1.setVisible(bool);
    }
}

更新了frame1.setVisible(bool);行上的崩溃 线程“AWT-EventQueue-0”中的代码异常 java.lang.NullPointerException

最佳答案

首先,您应该知道您有 2 个 JFrame 对象:

  1. Tracker 本身就是一个JFrame。当您创建 Tracker 实例时,您同时也在创建一个新的 JFrame
  2. Tracker 在其构造函数中创建一个 JFrame

这意味着当您创建一个 Tracker 对象时,您正在创建 2 个 JFrame 对象(Tracker 对象是一个 JFrame ,以及 Tracker 中的 JFrame)。

首先删除 extends JFrame,并在字段中指定您的框架:

class Tracker {
    private JFrame frame;

    public Tracker() {
        //...
    }
}

您现在可以公开一个方法,setVisible,允许您随意显示/隐藏框架:

class Tracker {
    private JFrame frame;

    public Tracker() {
        //...
    }

    public void setVisible(boolean bool) {
        frame.setVisible(bool);
    }
}

这修复了您的 Tracker 类。现在是 switch 语句。

您可以使用 boolean 值来代替int RunTracker1。您可以执行 RunTracker1 = true,而不是 RunTracker1 = 1。您还应该将该变量的第一个字母小写:

if(!runTracker1) {
    //...
    runTracker1 = true;
}

但是根本不需要这个变量。相反,请将 Tracker tracker1 变量放在开关之前,可能位于您所在类的字段中:

Tracker tracker1 = null;
switch(i) {
    case 0:

        break;
}

然后您可以检查tracker1是否为null来确定表单是否已创建:

Tracker tracker1 = null;
switch(i) {
    case 0:
        if(tracker1 == null) {
            tracker1 = new Tracker();
        } else {
            //display
        }
        break;
}

请注意我如何将 Tracker1 更改为 tracker1,以避免变量和类型之间出现歧义。变量应以小写字母开头,类型(类/接口(interface)/枚举)应以大写字母开头。

现在您正在保留 Tracker(可能在现场),如果它已经创建,您可以调用它的方法:

Tracker tracker1 = null;
switch(i) {
    case 0:
        if(tracker1 == null) {
            tracker1 = new Tracker();
        } else {
            tracker1.setVisible(true);
        }
        break;
}

关于java - 如何重新打开使用类创建的同一表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725666/

相关文章:

java - 返回本地初始化的数组是否可以,如果不能,我该怎么做?

java - 如何从 HTTP POST 读取文件

javascript - 函数内的变量困惑

javascript - 如何将变量设置为 AJAX 响应数据?

javascript - 将作用域从一个函数传递到另一个函数

java - Switch 语句给出不兼容的类型错误

ruby-on-rails - 使用|| Rails中的Case开关

java - 使用祖先在 GAE 上强制与对象化的强一致性

java - Java 中的切换大小写语法

java - Jsoup HTTP 获取 URL 时出错。进行后请愿时 Status=403