2011-02-27 17 views
2

ランダムスプレッドで満たされた10 x 10グリッドの幾何矩形を出力するJava Swingでプログラムを作成しようとしています。しかし、ユーザが表示ウィンドウ内の矩形の1つをクリックすると、矩形は再描画()され、別の色に変更されます。MouseListener Help Java

これまでのところ、私は初歩的なプログラムを実行していますが、ユーザーが内部をクリックしたときに四角形の色が変わるようにするためにmouseListenerを実装する方法を理解できません。この時点で、長方形は、表示ウィンドウが拡大され最小化されたときにのみ再描画されます。どんなアドバイスや助けも大歓迎です!ありがとう!ここで

は、代わりにあなたがボタンのグリッドを持っているかについて、上の色のグリッドを描くJPanelを有していると...私がこれまで持っているもの

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は、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(); 
      } 
     }); 
    } 
} 
+0

この例は私にこれをどうやって行うのがより良いアイデアを与えるのかという大きな助けとなりました。しかし、このコードを実行すると、10x10グリッドにランダムに色付けされた四角形が表示されます。長方形を表示するにはどうすれば編集できますか? – astroDude1

+0

ラベルの推奨サイズを変更してみてください。 – trashgod

3

です。ボタンの描画メカニズムをオーバーライドして、現在の色として描画します。次に、グリッドの特定のセクションでクリックが発生するのを待機する機能が組み込まれています。

+0

ここに関連する例があります:http://stackoverflow.com/questions/3420431 – trashgod

+0

良い例。ありがとう! – astroDude1

1

これは私が思いついたものです。 注:私はまだ大学でJavaを勉強しているので、これはこれを行う正確な方法ではないかもしれませんが、私がやったときにうまくいったのです。

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

これは最初の部分です.2番目の部分は、コード内にこれらのメソッドを持つことです。これが助けた

repaint(); 

希望:

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) { 

} 

次に、あなたが望むものに応じて、ただで入力(すなわち、マウスがクリックされたか、押されました)。

+1

'MouseAdapter'を使うと、コードが簡単になるかもしれません。 – trashgod

+0

非常に有用な情報。ありがとうございました! – astroDude1

0

あなたは色の2Dアレイを有すると仮定すると、あなたは単にあなたがその矩形の指数を計算するためにクリックしたときのMouseListenerはあなたを与えるxとyを使用することができます。整数除算を使用して、xとyを四角形のサイズで除算するだけです。色を変更した後、repaint()を使用して表示します。