GridLayout + Мышь Слушатель
Ладно, ребята, у меня проблема, я не знаю, как узнать, какая ячейка была нажата на макет сетки, есть ли функция?
У меня есть макет сетки на контейнере, для 10 строк и 10 столбцов, и то, что я хочу, - это прослушиватель мыши для всех ячеек, поэтому, когда я нажимаю ячейку (2,1), он будет говорить, какую ячейку Я нажимаю из-за прослушивателя мыши.
Есть какие-нибудь зацепки? большое спасибо заранее
3 ответа:
Добавьте MouseListener в контейнер, который использует GridLayout и который содержит компоненты в сетке. Затем на 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() и getY() класса mouseListener вы находите местоположение мыши, нажатой, то если x и y расположения мыши в диапазоне ячейки(2,1) вы можете знать, что это нажал на ячейку (2,1).