gpt4 book ai didi

java - 如何使用另一个 JLabel 控制 Java Swing JLabel

转载 作者:行者123 更新时间:2023-12-01 23:29:40 24 4
gpt4 key购买 nike

我有一系列类,并且在每个类中都有一个 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(...); 的任何实例,您会发现它不存在。

一个具体的狭义答案是告诉您在尝试使用变量之前始终使用有效引用来初始化它们。

更广泛、更适用的答案需要您更详细地描述您的问题,并考虑创建和发布 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;
}
}
}
}

关于java - 如何使用另一个 JLabel 控制 Java Swing JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com