0

我有一个类数组,每个类都有一个 Java swing 标签。这个类与我的主要 GUI 类位于一个包中,其中包含我所有的真实标签和类数组。我想将每个类中的标签分配给 GUI 中的标签,以便我可以通过数组访问/控制它们。尝试通过数组的标签更改标签的文本时出现 NullPointerException。代码如下。

public class Pin {
   javax.swing.JLabel ioLabel;

   public Pin()
   {
      ioLabel = null;
   }
}

private Pin[] mux;
javax.swing.JLabel io0Label;

public GUI()
{
   mux = new Pin[62];
   io0Label = new javax.swing.JLabel();

   for (int i = 0; i < mux.length; i++)
   {
      mux[i] = new Pin();
   }

   mux[0].ioLabel = io0Label;
}

private void event(evt)
{
   mux[0].ioLabel.setText("Updated");  //The error occurs here
}

能够做到这一点将使解决我的问题变得更加容易,但我似乎无法让阵列的 ioLabel 来控制 GUI 之一。

谢谢。

4

1 回答 1

3

你的代码在这里:

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;
         }
      }
   }
}
于 2013-10-22T22:00:33.230 回答