2011-02-27 101 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()來顯示它。