通过使用变量来调用它来编辑Jlable?
Edit a Jlable by using a variable to call it?
我正在写一些代码,我想让它尽可能灵活,所以我使用了很多变量,我有一个名为 username
的字符串变量。我还有一些 Jlabel,它们的名称与任何可能进入 username
变量的名称相同。如何更改username
变量中字符串对应的Jlabel的启用状态?
编辑:需要说明的是,我有一个散列表,其中包含我想从用户那里接受的 ID 的键。这些键指向具有 name
(字符串)和 status
(布尔)变量的对象。对于 hashmap 中的每个条目,我将添加一个 Jlabel 来保存那个人的照片。 Jlabels 名称将对应于对象中的 name
。
编辑:所以首先它检查散列图以查看输入的数字是否与散列图中的键之一匹配。如果是,它将 name
从该对象复制到 username
,然后检查对象的状态。如果 status
为假(默认),我希望它更改与 username
同名的 Jlabel 以启用。如果 status
为真,则更改为禁用。请记住,稍后我将不得不使用大量对象和 Jlabel 来扩展它。
我的问题是,如果不使用大量 IF 语句,我无法告诉 java 要更改哪个 Jlabel。
我在想这样的事情,但它会 return 编译器错误:"The method setEnabled (boolean) is undefined for the type String"
username.setEnabled(true);
现在您正在使用 HashMap<String, boolean>
,但您确实应该使用 HashMap<String, JLabel>
,因为您可以直接在 [=16] 上使用 isEnabled()
和 setEnabled(boolean b)
=] 附加到他们的 String
ID。由以下示例中的代码片段演示:
HashMap<String, JLabel> yourMap = new HashMap<>();
// ...
yourMap.get(id).setEnabled(!yourMap.get(id).isEnabled());
在 JTextField
中输入 12345
或 54321
并按回车键切换两个 JLabel
是否启用:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("JLabel Text Example");
final HashMap<String, JLabel> yourMap = new HashMap<>();
yourMap.put("12345", new JLabel("Example Text"));
yourMap.put("54321", new JLabel("Other Text"));
final JTextField input = new JTextField(5);
input.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = input.getText();
if(yourMap.get(text) != null) {
yourMap.get(text).setEnabled(!yourMap.get(text).isEnabled());
}
}
});
final JPanel labels = new JPanel();
labels.setLayout(new BoxLayout(labels, BoxLayout.Y_AXIS));
for(JLabel label : yourMap.values()) {
labels.add(label);
}
frame.getContentPane().add(input);
frame.getContentPane().add(labels, BorderLayout.SOUTH);
frame.pack();
frame.setLocationByPlatform(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
我正在写一些代码,我想让它尽可能灵活,所以我使用了很多变量,我有一个名为 username
的字符串变量。我还有一些 Jlabel,它们的名称与任何可能进入 username
变量的名称相同。如何更改username
变量中字符串对应的Jlabel的启用状态?
编辑:需要说明的是,我有一个散列表,其中包含我想从用户那里接受的 ID 的键。这些键指向具有 name
(字符串)和 status
(布尔)变量的对象。对于 hashmap 中的每个条目,我将添加一个 Jlabel 来保存那个人的照片。 Jlabels 名称将对应于对象中的 name
。
编辑:所以首先它检查散列图以查看输入的数字是否与散列图中的键之一匹配。如果是,它将 name
从该对象复制到 username
,然后检查对象的状态。如果 status
为假(默认),我希望它更改与 username
同名的 Jlabel 以启用。如果 status
为真,则更改为禁用。请记住,稍后我将不得不使用大量对象和 Jlabel 来扩展它。
我的问题是,如果不使用大量 IF 语句,我无法告诉 java 要更改哪个 Jlabel。
我在想这样的事情,但它会 return 编译器错误:"The method setEnabled (boolean) is undefined for the type String"
username.setEnabled(true);
现在您正在使用 HashMap<String, boolean>
,但您确实应该使用 HashMap<String, JLabel>
,因为您可以直接在 [=16] 上使用 isEnabled()
和 setEnabled(boolean b)
=] 附加到他们的 String
ID。由以下示例中的代码片段演示:
HashMap<String, JLabel> yourMap = new HashMap<>();
// ...
yourMap.get(id).setEnabled(!yourMap.get(id).isEnabled());
在 JTextField
中输入 12345
或 54321
并按回车键切换两个 JLabel
是否启用:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("JLabel Text Example");
final HashMap<String, JLabel> yourMap = new HashMap<>();
yourMap.put("12345", new JLabel("Example Text"));
yourMap.put("54321", new JLabel("Other Text"));
final JTextField input = new JTextField(5);
input.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = input.getText();
if(yourMap.get(text) != null) {
yourMap.get(text).setEnabled(!yourMap.get(text).isEnabled());
}
}
});
final JPanel labels = new JPanel();
labels.setLayout(new BoxLayout(labels, BoxLayout.Y_AXIS));
for(JLabel label : yourMap.values()) {
labels.add(label);
}
frame.getContentPane().add(input);
frame.getContentPane().add(labels, BorderLayout.SOUTH);
frame.pack();
frame.setLocationByPlatform(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}