如何重新打开使用类创建的相同表单

时间:2016-04-19 17:40:47

标签: java scope switch-statement

Class Tracker设置为Hide_on_Close,这是创建我的表单的原因。 我有一个开关,我试图首先打开表单,如果它从未打开过,然后在第二次调用开关时重新显示包含所有数据的SAME表单。

我只是在学习编码而且我不知道如何重新打开相同的表格。我可以打开它的新实例,但所有数据都已消失。

    `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

1 个答案:

答案 0 :(得分:1)

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

  1. 跟踪器本身就是JFrame。当您创建Tracker的实例时,您还要创建新的JFrame
  2. Tracker在其中构建了JFrame
  3. 这意味着当您创建Tracker对象时,您将创建2个JFrame个对象(Tracker对象,即JFrame,以及{{1在JFrame)内。

    首先删除Tracker,然后在字段中指定您的框架:

    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); } } 课程。现在为switch语句。

    您可以使用布尔值代替Tracker。您可以int RunTracker1而不是RunTracker1 = 1。您还应该将该变量的第一个字母设为小写:

    RunTracker1 = true

    但这个变量根本不需要。相反,将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,以避免变量和类型之间存在歧义。变量应以小写字母开头,类型(classes / interfaces / enums)以大写字母开头。

    现在您正在保留tracker1(可能在字段中),如果已经创建了它,可以调用它上面的方法:

    Tracker