【问题标题】:how to set color of multiple jlabel on click netbeans?如何在单击 netbeans 上设置多个 jlabel 的颜色?
【发布时间】:2016-03-08 12:30:41
【问题描述】:

我在一个 JPanel 上有多个 JLabel。当我单击 JLabel 时,背景变为绿色。

我想一次只制作一个绿色标签。例如,如果我单击 JLabel1,它必须变为绿色。如果我单击另一个 JLabel2,则 JLabel1 必须变为红色,而 JLabel2 必须变为绿色。

我有很多 JLabel,无法为每个人举办活动。我搜索了很多,但我没有找到任何东西。我正在使用 Netbeans 8.1。

JLabel 被声明和初始化。这代表酒店的房间地图。

JLabels 声明:

 JLabel p401,p402,p403,phol,a301,a302,a303,a304,a305,a306,ahol;
 JLabel d201,d202,d203,d204,d205,d206,d207,d208,d209,d210,dhol;
 JLabel r10,r11,r12,r13,r14,r15,r16,r17,r18,r19;
 JLabel r20,r21,r22,r23,r24,r25,r26,r27,r28,r29;
 JLabel r30,r31,r32,r33,r34,r35,r36,r37,r38,r39;
 JLabel r40,r41,r42,r43,r44,r45,r46,r47,r48,r49;
 JLabel r50,r51,r52,r53,r54,r55,r56,r57,r58,r59;

变绿功能:

public void click(JLabel l)
{
    l.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            l.setOpaque(true);
            l.setBackground(Color.GREEN);
            System.out.println(l.getText());
            getCamId(l.getText()); 
            cam.setText(String.valueOf(idCam));
        }
    }); 
}

【问题讨论】:

    标签: java swing netbeans jlabel


    【解决方案1】:
    1. 首先,将所有 JLabel 放入一个数组或 ArrayList<JLabel>
    2. 我更喜欢使用更灵活的 ArrayList,并且通常在循环内创建我的 JLabels 集合,例如,如果我在循环之前知道要创建多少标签,则使用 for 循环,如果不知道,则使用 while 循环.
    3. 在同一个创建循环中,将创建的 JLabel 添加到 ArrayList<JLabel> 以及包含所有标签的 JPanel 容器中。
    4. JPanel 容器应该有一个不错的布局,例如 GridLayout,这样它才能很好地显示 JLabel。
    5. 必须通过myLabel.setOpaque(true) 将所有 JLabel 设置为不透明,以便显示它们的背景颜色。
    6. 创建一个所有人都可以共享的 MouseListener,并将其添加到 ArrayList 内的每个标签中。
    7. 在 MouseListener 的 mousePressed 方法中,使用 for 循环遍历 ArrayList 将所有标签变为红色,对列表中保存的每个 JLabel 调用 setBackground(Color.RED)
    8. 在同一方法内部,通过在 MouseEvent 参数上调用 JLabel selectedLabel = (JLabel) e.getSource() 来获取按下的 JLabel。
    9. 在 for 循环之后,通过调用 setBackground(...) 将选中的 JLabel 的背景颜色更改为 Color.GREEN。

    如果您想为您的代码提供更具体的帮助,那么您必须展示您的相关代码。

    例如

    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 javax.swing.*;
    
    @SuppressWarnings("serial")
    public class LabelGrid extends JPanel {
        // number of columns in the "hallways"
        private static final int COLUMNS = 10;
    
        // colors of the current selection and the previous selection
        public static final Color PREVIOUS_SELECTION_COLOR = Color.RED;
        public static final Color CURRENT_SELECTION_COLOR = Color.GREEN;
    
        // Strings for the rooms.
        private String[] pRooms = { "p401", "p402", "p403", "phol" };
        private String[] aRooms = { "a301", "a302", "a303", "a304", "a305", "a306", "ahol" };
        private String[] dRooms = { "d201", "d202", "d203", "d204", "d205", "d206", "d207", "d208", "d209", "d210", "dhol" };
        private String[] rRooms = { 
                "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
                "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", "r32", "r33", "r34", "r35", "r36",
                "r37", "r38", "r39", "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", "r48", "r49", "r50", "r51",
                "r52", "r53", "r54", "r55", "r56", "r57", "r58", "r59" };
    
        // array of array, just to simplify
        private String[][] allRooms = {
                pRooms, aRooms, dRooms, rRooms
        };
    
        // previously selected JLabel. This will be colored RED
        private JLabel previousSelectedLabel = null;
    
        // ArrayList to hold **all** JLabels
        private List<JLabel> labelList = new ArrayList<>();
    
        public LabelGrid() {
    
            // the MouseListener:
            MyMouse myMouse = new MyMouse();
    
            // layout for the overall GUI
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    
            // go through the array of arrays
            for (String[] strings : allRooms) {
                // create a JPanel to hold each "hallway" of JLabels
                JPanel container = new JPanel(new GridLayout(0, COLUMNS, 5, 5));
                container.setBorder(BorderFactory.createLineBorder(Color.blue));
    
                // iterate through the Strings in the 2nd dimension of our 2D String array
                for (String text : strings) {
                    // create a JLabel with the String
                    JLabel label = new JLabel(text, SwingConstants.CENTER);
                    // make it bigger
                    label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                    // make it opaque
                    label.setOpaque(true);
                    // add the mouse listenr
                    label.addMouseListener(myMouse);
                    // add it to the arraylist
                    labelList.add(label);
    
                    // add it to the container JPanel
                    container.add(label);
                }
    
                // add the container JPanel to the GUI
                add(container);
            }
        }
    
        private class MyMouse extends MouseAdapter {
            @Override
            public void mousePressed(MouseEvent e) {
                // go through all the JLabels clearing all colors
                for (JLabel lbl : labelList) {
                    lbl.setBackground(null); // clear labels
                }
    
                // color the previously selected JLabel to RED 
                if (previousSelectedLabel != null) {
                    previousSelectedLabel.setBackground(PREVIOUS_SELECTION_COLOR);
                }
    
                // get currently selected JLabel
                JLabel label = (JLabel) e.getSource();
                // set it to green
                label.setBackground(CURRENT_SELECTION_COLOR);
    
                // make it now the previously selected label.
                previousSelectedLabel = label;
            }
        }
    
        private static void createAndShowGui() {
            JFrame frame = new JFrame("LabelGrid");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new LabelGrid());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                createAndShowGui();
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可能只需要:

      1. 创建 1 个方法来处理单击 JLabel 时发生的情况。
      2. 使用JPanel.getComponents()获取所有组件。
      3. 使用instance of 运算符确保组件是JLabel
      4. 如果组件是JLabel,则将1 中的方法分配为click 事件处理程序。

      然后,在事件处理程序中,只需执行与上述相同的操作。事件本身应该允许您访问source,这是触发事件的组件。您只需执行以下操作:

      1. 遍历标签并将它们设置为绿色背景。*
      2. 获取事件源并将其设置为红色。

      *这可以通过保留一个表示当前选定标签的标签来改进。单击标签时,您将重置该标签的背景并更新它以显示用户单击的新标签。

      【讨论】:

      • “使用 JPanel 的 .getComponents() 获取所有组件。” 或使用数组或 ListMap 或任何其他解决方案打喷嚏时不会破裂:P
      猜你喜欢
      • 2022-01-11
      • 2019-06-15
      • 1970-01-01
      • 2019-03-22
      • 2013-07-10
      • 1970-01-01
      • 2019-11-28
      • 2018-09-02
      相关资源
      最近更新 更多