在运行时使用反射改变JLabel的背景



我需要动态地改变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. ?

任何提纲都可以。

目前您只关注字段本身—您感兴趣的是这些字段的。例如:

Object value = fld[i].get(target); // Or null for static fields
if (value == label5) {
    ...
}

这里target是对对象的引用,您想从中获取字段的值。对于静态字段,只使用null,如注释所示。

所有这些都不是一个好主意,然而- 可以通过反射解决的问题通常更好地以另一种方式解决。我们现在没有足够的上下文来给你具体的建议,但我建议你至少试着想想更干净的设计。

尝试使用Jcomponent.putClientProperty()Jcomponent.getClientProperty()

后续步骤:

  • 首先设置JLabel的名称与其变量名称
  • 相同
  • JLabel添加为JPanel的客户端属性
  • 使用JLabel的名称从JPanel获取客户端属性

注意:您可以通过使用问题中定义的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;
    }
}

最新更新