如何在 click netbeans 上设置多个 jlabel 的颜色?

how to set color of multiple jlabel on click netbeans?

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

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

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

JLabel 已声明并初始化。这是某酒店房间图

JLabel 的声明:

 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));
        }
    }); 
}
  1. 首先,将所有的JLabel 放入一个数组或一个ArrayList<JLabel> 中。
  2. 我更喜欢使用更灵活的 ArrayList,并且通常在循环内创建我的 JLabel 集合,例如,如果我在循环之前知道要创建多少标签,则使用 for 循环;如果我不知道,则使用 while 循环't。
  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. 在同一方法内部,通过调用 JLabel selectedLabel = (JLabel) e.getSource() MouseEvent 参数来获取按下的 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();
        });
    }
}

您可能只需要:

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

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

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

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