5

わかりました、問題があります。グリッド レイアウトでどのセルがクリックされたかを知る方法がわかりません。機能はありますか?

コンテナーに 10 行 10 列のグリッド レイアウトがあり、すべてのセルに対するマウス リスナーが必要なため、セル (2,1) をクリックすると、マウス リスナーのためにクリックしているセルが表示されます。 .

手がかりはありますか?事前にたくさんのありがとう

4

3 に答える 3

9

GridLayout を使用し、グリッド内のコンポーネントを保持する Container に MouseListener を追加します。次に、mousePressed で、たとえば myMouseEvent という名前の MouseEvent オブジェクトを使用して、クリックのポイント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();
         }
      });
   }
}
于 2011-11-14T21:55:31.930 に答える
0

コンテナの幅と高さを操作し、コンテナの幅と高さを取得してセルの数に分割し、セルの範囲を見つけることができます(コンテナの幅と高さが等しい場合など) 100 および行数、列 = 10*10 の場合、セル (2,1) の左座標は x=10、y=0 であり、mouseListener クラスのメソッド getX() および getY() によって、マウスの位置を見つけますクリックした場合、マウス位置の x と y が cell(2,1) の範囲内にある場合、cell(2,1) をクリックしたことがわかります。 ここに画像の説明を入力

于 2011-11-14T21:07:02.557 に答える
-1

UI のすべてのコンポーネントに mouselistener を再帰的に追加してデバッグします...

于 2011-11-14T20:52:05.707 に答える