在Java中将String转换为Component name

时间:2014-09-16 14:54:30

标签: java swing jpanel mouselistener

我搜索了StackOverflow并发现了这个问题,但我无法得到它。

How do I invoke a Java method when given the method name as a string?

我有一些JLabel和JPanels,每个Label都作为自定义图形按钮来改变特定JPanel的背景颜色,因为有很多这些标签,所以我创建了一个自定义MouseListener来改变背景颜色具有每个JLabel名称的特殊JPanel。

现在,因为这些JLabel给出了以字符串值调用JPanels的名称,我想要这样的东西

@Override
public void mouseClicked(MouseEvent e)
{
    e.getComponent().getName().setBackground(new COLOR.RED);
}

但我不能这样做。

我只想将我的字符串转换为JPanel的名字。

3 个答案:

答案 0 :(得分:2)

您可以使用"客户端属性"来自JComponent。每个Jcomponent都包含一个Map,用于将属性放入其中。您可以使用常量字符串,例如" associatedPanel"对于键,以及JPanel的值。 代码可能是这样的:

JPanel panel1 = new JPanel();
JLabel label1 = new JLabel();
label1.putClientProperty("associatedPanel", panel1);

现在在鼠标监听器中使用getClientProperty(" associatedPanel")来获取相关面板来设置背景。

答案 1 :(得分:0)

你可以这样做:

创建地图:

Map<String, JPanel> map = new HashMap<String, JPanel>();

然后使用其名称作为键将所有jPanel放入其中:

map.put("jPanel1", jPanel1);

然后在事件监听器中:

JPanel jPanel1 = map.get(e.getComponent().getName());

答案 2 :(得分:0)

我想说,关联UI的两个元素的最简单的解决方案是将它们组合成一个类。然后从另一个引用相应的元素变得显而易见。

类似的东西:

class LabelPanel {
   JLabel label;
   JPanel pane;
   ...
}

基本工作示例:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class TestLabelPanelComposition {

    public static class LabelPanel {

        private final JLabel label;
        private final JPanel panel;
        private Color colorToSet;
        public LabelPanel(String labelText, final Color colorToSet) {
            super();
            this.colorToSet = colorToSet;
            this.label = new JLabel(labelText);
            this.panel = new JPanel();
            label.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    Color old= panel.getBackground();
                    panel.setBackground(LabelPanel.this.colorToSet);
                    LabelPanel.this.colorToSet = old;
                }
            });
        }

        public JLabel getLabel() {
            return label;
        }

        public JPanel getPanel() {
            return panel;
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new  TestLabelPanelComposition().initUI();
            }
        });
    }

    protected void initUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Random r= new Random();
        List<LabelPanel> labelPanels =new ArrayList<TestLabelPanelComposition.LabelPanel>();
        for(int i=0;i<10;i++) {
            LabelPanel labelPanel = new LabelPanel("My Label to click "+(i+1), new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
            labelPanel.getPanel().add(new JLabel("Some dummy text inside panel "+(i+1)));
            labelPanels.add(labelPanel);
        }
        frame.setLayout(new GridLayout(0, 5));
        for (LabelPanel labelPanel : labelPanels) {
            frame.add(labelPanel.getLabel());
        }
        for (LabelPanel labelPanel : labelPanels) {
            frame.add(labelPanel.getPanel());
        }
        frame.pack();
        frame.setVisible(true);
    }
}

这不应该太难以适应你的实际情况。