java - MouseListener 帮助 Java

标签 java user-interface swing paint mouselistener

我正在尝试用 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();
    }
}

最佳答案

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

附录:在别处推荐了 MouseAdapter 之后,我应该提到 一个 实例就足够了。

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

ColorLabel picture

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();
            }
        });
    }
}

关于java - MouseListener 帮助 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136859/

相关文章:

java - Bean 验证和 JAX-WS

user-interface - Scala 中功能最强大且易于使用的 SWT API 是什么?

python - 如何避免 tkinter 中的 checkbutton 被覆盖

Android - 如何将数据传递给runOnUiThread中的Runnable?

java - 如何在不闪烁的情况下使用 HTML 更新 JComponent?

java - JTable 添加到 Jpanel 时不可见

java - 检索 JTextField 文本值

java - System.in 无法与 Scanner 配合使用 (NoSuchElementException)

Java IOException 错误/表达式的非法开始

java - Mongo/Spring boot 从集合中删除列表中的所有文档