GridLayout +鼠标监听器

好的家伙我有一个问题,我不知道怎么知道在网格布局上点击了哪个单元格,有什么function吗?

我在容器上有网格布局,包含10行和10列,我想要的是所有单元格的鼠标监听器,所以当我单击单元格(2,1)时,它会说出由于鼠标监听器而单击的单元格。

有什么线索吗? 非常感谢

将MouseListener添加到使用GridLayout并保存网格中的组件的Container。 然后在mousePressed上使用MouseEvent对象,比如名为myMouseEvent,获取点击并调用getComponentAt(myMouseEvent.getPoint); 获取点击的组件。 没有麻烦没有大惊小怪。

例如:

 import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.*; public class TestComponentAt extends JPanel { private static final int ROW_COUNT = 10; private static final int W = 60; private static final int H = W; private static final Dimension PREF_SIZE = new Dimension(W, H); protected static final Color SELECTION_COLOR = Color.pink; private JPanel selectedPanel = null; private Color originalColor = null; public TestComponentAt() { setLayout(new GridLayout(ROW_COUNT, ROW_COUNT, 1, 1)); setBackground(Color.black); for (int i = 0; i < ROW_COUNT * ROW_COUNT; i++) { JPanel panel = new JPanel(); String name = String.format("[%d, %d]", i / ROW_COUNT, i % ROW_COUNT); panel.setName(name); if (i == 0) { originalColor = panel.getBackground(); } panel.setPreferredSize(PREF_SIZE); add(panel); } addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JPanel panel = (JPanel) getComponentAt(e.getPoint()); if (panel == null || panel == TestComponentAt.this) { return; } if (selectedPanel != null) { selectedPanel.setBackground(originalColor); selectedPanel.removeAll(); selectedPanel.revalidate(); selectedPanel.repaint(); } selectedPanel = panel; selectedPanel.setBackground(SELECTION_COLOR); selectedPanel.add(new JLabel(selectedPanel.getName())); selectedPanel.revalidate(); selectedPanel.repaint(); } }); } private static void createAndShowGui() { JFrame frame = new JFrame("TestComponentAt"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new TestComponentAt()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

您可以使用宽度和容器的高度,获取容器高度的宽度并将其除以单元格数量并找到单元格的范围(2,1),例如,如果容器的宽度和高度等于100和行数,列= 10 * 10然后单元格(2,1)的左坐标是x = 10,y = 0并通过方法getX()和mouseListener类的getY()找到鼠标的位置单击,然后如果鼠标位于单元格(2,1)范围内的x和y,您可以知道它单击了单元格(2,1)。 在此处输入图像描述

以递归方式将mouselistener添加到UI中的所有组件并进行调试…