你的代码在这里:
javax.swing.JLabel io0Label;
public GUI()
{
mux = new Pin[62];
for (int i = 0; i < mux.length; i++)
{
mux[i] = new Pin();
}
mux[0].ioLabel = io0Label;
}
您声明了 io0Label 变量,但从不为其分配 JLabel 实例,因此尝试使用它总是会导致抛出 NPE。为了证明这是正确的,请在您发布的代码中搜索 的任何实例 something = new JLabel(...);
,您会发现它不存在。
一个具体的狭义答案是告诉您在尝试使用变量之前始终使用有效引用初始化变量。
更广泛更适用的答案将要求您更详细地描述您的问题并考虑创建和发布sscce。
顺便说一句,不推荐您的程序设计,因为您不应该让类直接操作其他类的字段。这增加了类的连接性,并可能导致非常难以调试的错误。
例如,您可以简单地为您的 Pin 类getText()
和setText(String text)
getter 和 setter 方法以及将其作为 JComponent 返回的 JLabel 的 getter 方法,并使用这些人。
例如,我的sscce:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ControlLabels {
private static void createAndShowGui() {
JFrame frame = new JFrame("ControlLabels");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Gui());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class Pin {
private JLabel ioLabel = new JLabel();
public Pin() {
ioLabel.setHorizontalAlignment(SwingConstants.CENTER);
}
public String getText() {
return ioLabel.getText();
}
public void setText(String text) {
ioLabel.setText(text);
}
public JComponent getIoLabel() {
return ioLabel;
}
}
class Gui extends JPanel {
private static final int LABEL_CNT = 50;
private static final int PREF_W = 150;
private static final int PREF_H = 400;
private static final int TIMER_DELAY = 1000;
private Pin[] mux = new Pin[LABEL_CNT];
public Gui() {
JPanel labelPanel = new JPanel(new GridLayout(0, 1));
for (int i = 0; i < mux.length; i++) {
mux[i] = new Pin();
mux[i].setText("mux " + i);
labelPanel.add(mux[i].getIoLabel());
}
setLayout(new BorderLayout());
add(new JScrollPane(labelPanel));
new Timer(TIMER_DELAY, new TimerListener()).start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private class TimerListener implements ActionListener {
private static final int MAX_COUNT = 20;
private int count = 0;
@Override
public void actionPerformed(ActionEvent arg0) {
if (count < MAX_COUNT) {
int multiplier = 2;
for (int i = 0; i < count; i++) {
multiplier *= 2;
}
for (int i = 0; i < mux.length; i++) {
mux[i].setText("mux " + (i + multiplier));
}
count++;
} else {
count = 0;
}
}
}
}