类跟踪器设置为 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
对象:
- Tracker 本身就是一个
JFrame
。当您创建Tracker
实例时,您同时也在创建一个新的JFrame
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/