2011-02-27 103 views
2

我试图用Java编写的Swing程序输出充满随机量的色彩几何矩形的10×10格。但是,当用户单击显示窗口中的其中一个矩形时,该矩形应重绘()并更改为其他颜色。的MouseListener帮助Java

到目前为止我有基本的程序运行,但我无法弄清楚如何实现的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

任何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(); 
      } 
     }); 
    } 
} 
+0

这个例子给了我一个很好的帮助,让我更好地了解如何做到这一点,然而,当执行这段代码时,这个代码提供了一个10x10的随机彩色方格网格。我如何编辑它以显示矩形? – astroDude1 2011-02-28 02:28:41

+0

尝试更改标签的首选尺寸。 – trashgod 2011-02-28 03:04:53

3

取代具有JPanel你画你的颜色格上的怎么样,你有按钮的网格。您重写该按钮的绘图机制,以便它呈现为当前颜色。然后,您可以使用内置的功能来监听网格中特定部分发生的点击。

+0

这里有一个相关的例子:http://stackoverflow.com/questions/3420431 – trashgod 2011-02-28 00:47:28

+0

很好的例子。谢谢! – astroDude1 2011-02-28 02:27:06

1

这是我想出了。 注意:我仍然在大学学习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(); 

希望这有助于。

+1

使用'MouseAdapter'可能会简化您的代码。 – trashgod 2011-02-28 00:46:50

+0

非常有用的信息。谢谢! – astroDude1 2011-02-28 02:29:25

0

假设你有颜色的二维数组,你可以简单地使用X和Y的MouseListener给你当你点击来计算矩形的指标。只需使用整数除以矩形的大小来分割x和y。改变颜色后使用repaint()来显示它。