MouseListener Справка Java - PullRequest
       10

MouseListener Справка Java

2 голосов
/ 28 февраля 2011

Я пытаюсь написать программу на Java Swing, которая выводит сетку геометрических прямоугольников размером 10 x 10, заполненную случайными цветами. Однако, когда пользователь нажимает на один из прямоугольников в окне дисплея, прямоугольник должен перекрашиваться () и меняться на другой цвет.

Пока что у меня работает рудиментарная программа, но я не могу понять, как реализовать для нее 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();
    }
}

Ответы [ 4 ]

4 голосов
/ 28 февраля 2011

Любой Component может иметь MouseListener. JLabel подходит для цветного прямоугольника, если вы сделаете его непрозрачным.

Добавление: рекомендовав 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();
            }
        });
    }
}
3 голосов
/ 28 февраля 2011

Вместо того, чтобы иметь JPanel, на котором вы рисуете свою сетку цветов, как у вас есть сетка кнопок. Вы переопределяете механизм рисования для кнопки, чтобы она просто отображала текущий цвет. Затем у вас есть встроенная функция для прослушивания кликов в определенном разделе вашей сетки.

1 голос
/ 28 февраля 2011

Это то, что я придумал. Примечание: я все еще изучаю 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();

Надеюсь, это помогло.

0 голосов
/ 01 апреля 2014

Предполагая, что у вас есть двумерный массив цветов, вы можете просто использовать x и y, которые дает вам курсор мыши, когда вы нажимаете, чтобы вычислить индексы этого прямоугольника. Просто разделите x и y на размер прямоугольника, используя целочисленное деление. После изменения цвета используйте repaint (), чтобы показать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...