繁体   English   中英

如何用另一个JLabel控制Java Swing JLabel

[英]How to control a Java Swing JLabel with another JLabel

我有一个类数组,每个类中都有一个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。

谢谢。

您的代码在这里:

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(...);任何实例something = new JLabel(...); ,您会发现它不存在。

一个具体的狭窄答案是告诉您在尝试使用变量之前始终使用有效的引用对其进行初始化。

一个更广泛,更适用的答案将要求您更详细地描述问题,并考虑创建和发布sscce

顺便说一句,不建议您进行程序设计,因为您不应该让类直接操纵其他类的字段。 这增加了类的连接性,并可能导致难以调试的错误。


例如,您可以简单地为Pin类提供getText()setText(String text) getter和setter方法,以及JLabel的getter方法(将其作为JComponent返回),然后使用这些家伙。

例如,我的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;
         }
      }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM