我需要动态更改JLabels的背景。
我班上有70个JLabel。所有JLabel代表一些特定项目。项名称与JLabel的变量相同。已售商品名称保存在数据库中。如果我运行一个将返回已售商品数组的查询。与JLabel相同的已售商品应更改背景。休息不会改变。
我已经得到了所有字段的变量:
Field fld[] = BlueLine.class.getDeclaredFields();
for (int i = 0; i < fld.length; i++)
{
System.out.println("Variable Name is : " + fld[i].getName());
}
如何在特定条件满足时将fld
投射到JLabel
并更改JLabel的背景?例如:
if(fld[i] == label5){
label5.setBackground.(Color.red);
} // or something like this. ?
任何大纲都会有所帮助。
答案 0 :(得分:1)
目前,您只是查看字段本身 - 您对这些字段的值感兴趣。例如:
Object value = fld[i].get(target); // Or null for static fields
if (value == label5) {
...
}
此处target
是对要从中获取值的字段的对象的引用。对于静态字段,请根据评论使用null
。
根本不清楚所有这些都是一个好主意,但是可以通过反射解决的问题通常更好解决了不同的方式。我们目前没有足够的背景为您提供具体建议,但我建议您至少尝试考虑更清洁的设计。
答案 1 :(得分:1)
使用Jcomponent.putClientProperty()
和Jcomponent.getClientProperty()
尝试。
要遵循的步骤:
JLabel
的名称设置为与其变量名称相同JPanel
的客户端媒体资源添加JLabel
JPanel
JLabel
使用客户端属性获取回来
注意:您可以使用问题中定义的Field.getName()
来访问它。
示例代码:
final JFrame frame = new JFrame();
final JPanel panel = new JPanel();
panel.addContainerListener(new ContainerListener() {
@Override
public void componentRemoved(ContainerEvent e) {
String name = e.getChild().getName();
if (name != null) {
System.out.println(name + " removed");
panel.putClientProperty(name, null);
}
}
@Override
public void componentAdded(ContainerEvent e) {
String name = e.getChild().getName();
if (name != null) {
System.out.println(name + " added");
panel.putClientProperty(name, e.getChild());
}
}
});
MyLabels myLabels = new MyLabels();
panel.add(myLabels.getProduct1());
panel.add(myLabels.getProduct2());
panel.add(myLabels.getProduct3());
JButton btn = new JButton("Product1 and Product3 are sold");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String[] soldItems = new String[] { "Product1", "Product3" };
for (String soldItem : soldItems) {
Object obj = panel.getClientProperty(soldItem);
if (obj instanceof JLabel) {
((JLabel) obj).setForeground(Color.RED);
}
}
}
});
panel.add(btn);
frame.add(panel);
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
<强> MyLabels.java:强>
class MyLabels {
private JLabel Product1;
private JLabel Product2;
private JLabel Product3;
public MyLabels() {
Product1 = new JLabel("Product1");
Product1.setName(Product1.getText());
Product2 = new JLabel("Product2");
Product2.setName(Product2.getText());
Product3 = new JLabel("Product3");
Product3.setName(Product3.getText());
}
public JLabel getProduct1() {
return Product1;
}
public void setProduct1(JLabel product1) {
Product1 = product1;
}
public JLabel getProduct2() {
return Product2;
}
public void setProduct2(JLabel product2) {
Product2 = product2;
}
public JLabel getProduct3() {
return Product3;
}
public void setProduct3(JLabel product3) {
Product3 = product3;
}
}