我正在编写一些代码,我希望尽可能灵活,所以我使用了很多变量,并且我有一个名为username
的字符串变量。我也有一些Jlabel与可能进入username
变量的任何名称相同。如何更改与username
变量中的字符串对应的Jlabel的启用状态?
编辑:为了澄清一下,我有一个散列图,其中包含我想要从用户接受的ID的密钥。这些键指向具有name
(字符串)和status
(布尔)变量的对象。对于每个进入hashmap的条目,我将添加一个Jlabel来保存该人的照片。 Jlabels名称将对应于对象中的name
。
编辑:首先它检查hashmap以查看输入的数字是否与hashmap中的一个键匹配。如果是,则将name
从该对象复制到username
,然后检查对象的状态。如果status
为false(默认),我希望它将与username
同名的Jlabel更改为启用。如果status
为真,则更改为禁用。请记住,我将不得不在以后使用大量对象和Jlabel进行扩展。
我的问题是我无法告诉java哪个Jlabel在不使用大量IF语句的情况下进行更改。
我在想这样的事情,但它会返回一个编译器错误:“方法setEnabled(boolean)未定义类型String”
username.setEnabled(true);
答案 0 :(得分:0)
目前您使用的是HashMap<String, boolean>
,但您确实应该使用HashMap<String, JLabel>
,因为您可以直接在isEnabled()
上使用setEnabled(boolean b)
和JLabels
附加到String
个ID。由以下示例中的代码段演示:
HashMap<String, JLabel> yourMap = new HashMap<>();
// ...
yourMap.get(id).setEnabled(!yourMap.get(id).isEnabled());
在12345
中输入54321
或JTextField
,然后按Enter键以切换是否启用了两个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);
}
});
}
}