0

クラスの配列があり、各クラスに Java スイング ラベルがあります。このクラスは、すべての実際のラベルとクラスの配列を含むメインの 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を作成して投稿することを検討する必要があります。

余談ですが、他のクラスのフィールドを直接操作するクラスを持つべきではないため、プログラムの設計は推奨されません。これにより、クラスの接続性が向上し、デバッグが非常に困難なバグが発生する可能性があります。


getText()たとえば、Pin クラス、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 に答える