【问题标题】:Edit a Jlable by using a variable to call it?通过使用变量来编辑 Jlable 来调用它?
【发布时间】:2016-12-03 02:59:45
【问题描述】:

我正在编写一些代码,我想让它尽可能灵活,所以我使用了很多变量,并且我有一个名为username 的字符串变量。我还有一些 Jlabel,它们与可能进入 username 变量的任何东西同名。如何更改与username 变量中的字符串对应的 Jlabel 的启用状态?

编辑:为了澄清一下,我有一个哈希图,其中包含我想从用户那里接受的 ID 的键。这些键指向具有name(字符串)和status(布尔)变量的对象。对于哈希图中的每个条目,我将添加一个 Jlabel 来保存该人的照片。 Jlabels 名称将对应于对象中的name

编辑:所以首先它检查哈希图,看看输入的数字是否与哈希图中的一个键匹配。如果是这样,它将name 从该对象复制到username,然后检查对象的状态。如果status 为假(默认),我希望它将与username 同名的Jlabel 更改为启用。如果status 为真,则更改为禁用。请记住,稍后我将不得不使用大量对象和 Jlabel 来扩展它。

我的问题是如果不使用大量 IF 语句,我无法告诉 java 要更改哪个 Jlabel。

我在想这样的事情,但它会返回一个编译器错误:“方法 setEnabled (boolean) is undefined for the type String”

username.setEnabled(true);

【问题讨论】:

    标签: java eclipse swing jlabel


    【解决方案1】:

    现在您正在使用HashMap<String, boolean>,但您确实应该使用HashMap<String, JLabel>,因为您可以直接在附加到String ID 的JLabels 上使用isEnabled()setEnabled(boolean b)。由下面示例中的此代码 sn-p 演示:

    HashMap<String, JLabel> yourMap = new HashMap<>();
    // ...
    yourMap.get(id).setEnabled(!yourMap.get(id).isEnabled());
    

    JTextField 中输入1234554321,然后按回车键切换两个JLabels 是否启用:

    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);
                }
    
            });
        }
    
    }
    

    【讨论】:

    • 如果我只使用 1 个 JLabel,这不是一个糟糕的解决方案,但我的哈希图中的每个对象都需要 1 个 Jlabel。我可能应该解释得更好一点,所以用户在文本框中输入一个 ID 号,它将字符串转换为整数,然后检查该整数是否与我拥有的哈希映射中的任何键匹配。如果是,则检查我为与该键对应的对象创建的状态变量。如果状态为假(默认),我想将其设置为真,反之亦然。每个对象都将与包含图片的 Jlabel 配对。感谢您的帮助。
    • 感谢您的澄清,但这应该是对您问题的修改。
    • 我想根据 username 变量中的内容告诉 java 要编辑哪个 Jlabel
    • 哦,是的,我会改变它
    • 好的,我想我成功了。我对您的代码进行了一些调整,而不是像我在检查 JLabel 是否启用之前那样使用状态变量,然后对变量执行相同的操作。现在没有使用对象,我稍后设置了 JLabel 的名称并从中获取用户名!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多