【发布时间】:2015-07-15 00:09:50
【问题描述】:
我有一个实现卡片布局的类:
CardWindow.java
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import extraction.gui.Diagram;
import extraction.main.Main;
public class CardWindow extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
private JFrame f;
private JPanel panel_1, panel_2;
private JButton btnNext, btnBack;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CardWindow window = new CardWindow();
window.f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public CardWindow() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
f = new JFrame();
f.setBounds(100, 100, 1000, 480);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new CardLayout(0, 0));
panel_1 = new Main_1();
panel_2 = new Snd();
f.getContentPane().add(panel_1);
f.getContentPane().add(panel_2);
panel_1.setVisible(true);
panel_2.setVisible(false);
btnNext = new JButton("Next");
btnNext.setBounds(829, 417, 161, 29);
panel_1.add(btnNext);
btnNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel_1.setVisible(false);
panel_2.setVisible(true);
}
});
btnBack = new JButton("Back");
btnBack.setBounds(919, 5, 75, 29);
panel_2.add(btnBack);
btnBack.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel_2.setVisible(false);
panel_1.setVisible(true);
}
});
}
}
Main_1.java
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
public class Main_1 extends JPanel {
private JTextField textField;
/**
* Create the panel.
*/
public Main_1() {
setLayout(null);
textField = new JTextField();
textField.setBounds(131, 69, 134, 28);
add(textField);
textField.setColumns(10);
JButton btnCalculate = new JButton("Calculate");
btnCalculate.setBounds(131, 122, 117, 29);
add(btnCalculate);
btnCalculate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Calculate cal = new Calculate(textField.getText());
}
});
}
}
Snd.java
import javax.swing.JPanel;
import javax.swing.JLabel;
public class Snd extends JPanel {
/**
* Create the panel.
*/
public Snd() {
setLayout(null);
Calculate _cal = new Calculate();
JLabel label = new JLabel("New label");
label.setBounds(180, 120, 61, 16);
add(label);
label.setText(_cal.getNum().get(0).toString());
}
}
Calculate.java
import java.util.ArrayList;
import java.util.List;
public class Calculate {
private List<Integer> abc;
public Calculate () {
}
public Calculate(String number) {
abc = new ArrayList<Integer>();
int num = Integer.valueOf(number);
for (int i=0;i<num;i++) {
abc.add(i);
}
System.out.println(abc);
}
public List<Integer> getNum() {
return abc;
}
}
我还有另外两个JPanel 课程:Main_1.java、Snd.java
基本上当我打开应用程序时,它会显示Main_1.java。我输入了一些值,它在Calculate.java 中运行了一些东西。然后当我单击下一个按钮btnNext 时,它应该将处理后的数据显示到下一张卡片Snd.java 上。但是我在尝试运行应用程序时收到了java.lang.NullPointerException。
NPE 在这一行 label.setText(_cal.getNum().get(0).toString());
错误
java.lang.NullPointerException
at Snd.<init>(Snd.java:18)
at CardWindow.initialize(CardWindow.java:59)
at CardWindow.<init>(CardWindow.java:46)
at CardWindow$1.run(CardWindow.java:33)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我明白它为什么会产生 NPE,但我不知道如何解决它。当我运行程序时,我不明白为什么它也尝试运行Snd.java,因为我没有点击任何按钮转到下一张卡片,即Snd.java。
这只是一个可运行的示例,用于展示我想要实现的目标。基本上我想在Main_1.java 中处理一些东西并将数据传输到Snd.java,在那里我将在那里进行另一个处理。
【问题讨论】:
-
考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
-
@MadProgrammer ok 已经包含了一个可运行的示例。
-
@vaxquis 不,我完全理解 NPE 是什么。我知道是什么导致了 NPE,但这是因为我无法修复它,所以我在 SO 中发布了它。你仔细阅读我的问题了吗??
-
@sw2 你和我一样错了三次。 a)仅仅因为您不理解我提供给您的主题,并不意味着我没有阅读您的问题;我做到了,但我理解你的代码及其问题的不同之处——而你没有; - 另外,b) 提供的链接显示如何修复它。如果您对修复异常不感兴趣,那是您的决定,c) 您发布的问题是基本的,无论是在定位问题的根源还是在修复它方面。所以不是你的私人军队,我们也不是你的私人调试团队。你的“问题”已经解决了无数次了。
-
@sw2 还有,如果你做了
understand perfectly what NPE is,你就不必来 SO 并且会自己修复它;你出现en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect的急性症状
标签: java swing nullpointerexception layout-manager cardlayout