【问题标题】:swing - get component clicked on JPanelswing - 让组件在 JPanel 上单击
【发布时间】:2012-05-06 16:42:22
【问题描述】:

好的,所以我有一个带有 GridLayout 的 JPanel。然后网格的每个单元格都包含另一个 JPanel。

我想做的是在“下方”JPanel 上有一个监听器,然后它会告诉我点击了哪个“覆盖”JPanel - 这样我就可以对它和周围的JPanel 做出反应,而无需覆盖 JPanel 知道他们的位置(他们改变了!!)

有没有办法做到这一点 - 类似于 Determine clicked JPanel component in the MouseListener. Event handling 但我找不到抓住顶部组件的方法。

我可能会抓住坐标并使用该信息来解决 - 但我宁愿不这样做!

任何帮助/指针/提示将不胜感激:D

【问题讨论】:

    标签: java swing jpanel mouselistener grid-layout


    【解决方案1】:

    做同样的事情,但在源上使用getParent()。或者,如果层次结构更深,您可以搜索层次结构,甚至可以使用一些辅助方法: javax.swing.SwingUtilities.getAncestorOfClassgetAncestorNamed

    【讨论】:

      【解决方案2】:

      使用putClientProperty / getClientProperty,没有最简单的...,您可以将无数个 ClientProperty 放入一个对象

      import java.awt.Color;
      import java.awt.GridLayout;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.border.LineBorder;
      
      public class MyGridLayout {
      
          public MyGridLayout() {
              JPanel bPanel = new JPanel();
              bPanel.setLayout(new GridLayout(10, 10, 2, 2));
              for (int row = 0; row < 10; row++) {
                  for (int col = 0; col < 10; col++) {
                      JPanel b = new JPanel();
                      System.out.println("(" + row + ", " + col + ")");
                      b.putClientProperty("column", row);
                      b.putClientProperty("row", col);
                      b.addMouseListener(new MouseAdapter() {
      
                          @Override
                          public void mouseClicked(MouseEvent e) {
                              JPanel btn = (JPanel) e.getSource();
                              System.out.println("clicked column " + btn.getClientProperty("column")
                                      + ", row " + btn.getClientProperty("row"));
                          }
                      });
                      b.setBorder(new LineBorder(Color.blue, 1));
                      bPanel.add(b);
                  }
              }
              JFrame frame = new JFrame("PutClientProperty Demo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.add(bPanel);
              frame.pack();
              frame.setVisible(true);
          }
      
          public static void main(String[] args) {
              javax.swing.SwingUtilities.invokeLater(new Runnable() {
      
                  public void run() {
                      MyGridLayout myGridLayout = new MyGridLayout();
                  }
              });
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-15
        • 2012-06-19
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 2023-03-22
        相关资源
        最近更新 更多