【问题标题】:MouseListener Help JavaMouseListener 帮助 Java
【发布时间】:2011-02-27 23:35:29
【问题描述】:

我正在尝试用 Java Swing 编写一个程序,它输出一个 10 x 10 的几何矩形网格,其中填充了随机颜色。但是,当用户单击显示窗口中的一个矩形时,该矩形应该 repaint() 并更改为另一种颜色。

到目前为止,我已经运行了基本程序,但我不知道如何实现 mouseListener 以便在用户单击内部时更改矩形的颜色。此时,矩形仅在显示窗口展开和最小化时重新绘制。任何建议/帮助将不胜感激!谢谢!

这是我目前所拥有的......

   import java.awt.*;
   import javax.swing.*;
   import java.awt.event.*;
   import java.awt.geom.*;


public class ColorGrid extends JPanel {
   int w, x, y, z;
   Color c = new Color((int)(Math.random() * 0xFFFFFF));
   public void paint(Graphics g){
   Graphics2D g2 = (Graphics2D) g;

   setLayout(new GridLayout(10,10));

   int w = x = y = z = 0;
   for(int i=0;i<100;i++){
   Color c = new Color((int)(Math.random() * 0xFFFFFF));
   w+=10;
   x+=10;
   y+=50;
   z+=15; 

          g2.drawRect(w+10,x+30,y,z);
          g2.drawRect(w+10,x+30,y,z);               
          g2.fillRect(w+10,x+30,y,z);
          g2.setPaint(c);  
        } 
   }

   public static void main(String[] args) {
      JFrame f= new JFrame();
      f.setTitle("ColorGrid Display Window");
      f.setSize(200,200);
      f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
          System.exit(0);
          }
    });
    Container contentPane = f.getContentPane();
    contentPane.add(new ColorGrid());
    f.show();
    }
}

【问题讨论】:

    标签: java user-interface swing paint mouselistener


    【解决方案1】:

    任何Component 都可以有一个MouseListenerJLabel 非常适合彩色矩形,只要将其设为不透明即可。

    附录:在其他地方推荐了MouseAdapter,我应该提一下一个实例就足够了。

    附录:此更新在ColorLabel 构造函数中添加了鼠标侦听器。

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    /** @see http://stackoverflow.com/questions/5136859 */
    public class ColorLabel extends JLabel {
    
        private static final int N = 10;
        private static final Random random = new Random();
        private static final MouseAdapter listener = new MouseAdapter() {
    
            @Override
            public void mousePressed(MouseEvent e) {
                ColorLabel label = (ColorLabel) e.getSource();
                label.setBackground(new Color(random.nextInt()));
            }
        };
    
        public ColorLabel() {
            this.setOpaque(true);
            this.setBackground(new Color(random.nextInt()));
            this.setPreferredSize(new Dimension(32, 32));
            this.addMouseListener(listener);
        }
    
        private void displayGrid() {
            JFrame f = new JFrame("ColorGrid");
            f.setLayout(new GridLayout(N, N));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            for (int i = 0; i < N * N; i++) {
                final ColorLabel label = new ColorLabel();
                f.add(label);
            }
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ColorLabel().displayGrid();
                }
            });
        }
    }
    

    【讨论】:

    • 这个示例对我更好地了解如何执行此操作非常有帮助,但是,当执行此代码时,会提供一个 10x10 的随机颜色方块网格。我将如何编辑它以显示矩形?
    • 尝试更改标签的首选尺寸。
    【解决方案2】:

    与其使用JPanel 来绘制颜色网格,不如使用按钮网格。您覆盖按钮的绘图机制,使其仅呈现为当前颜色。然后,您就有了内置功能来监听在您的网格的特定部分发生的点击。

    【讨论】:

      【解决方案3】:

      这就是我想出的。 注意:我仍在大学学习 Java,所以这可能不是执行此操作的确切方法,但当我这样做时它确实有效。

      public class ColorGrid extends JPanel implements MouseListener {
      this.addMouseListener(this);
      addMouseListener(this);
      

      这是第一部分,第二部分是在你的代码中包含这些方法。

      public void mouseClicked(MouseEvent arg0) {
      
      }
      
      public void mouseEntered(MouseEvent arg0) {
      
      }
      
      public void mouseExited(MouseEvent arg0) {
      
      }
      
      public void mousePressed(MouseEvent arg0) {
      
      }
      
      public void mouseReleased(MouseEvent arg0) {
      
      }
      

      然后,根据您的需要(即鼠标单击或按下),只需输入:

      repaint();
      

      希望这会有所帮助。

      【讨论】:

      • 非常有用的信息。谢谢!
      【解决方案4】:

      假设您有一个二维颜色数组,您可以简单地使用鼠标侦听器在单击时为您提供的 x 和 y 来计算该矩形的索引。只需使用整数除法将 x 和 y 除以矩形的大小。更改颜色后使用 repaint() 显示它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 2016-04-28
        相关资源
        最近更新 更多