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