2016-08-17 8 views
1

MouseListenerを作成しようとしています。 JButtonの上にマウスを置くと、背景色と配列内の次のJButtonが変更されます。たとえば、私がJButton[0][0]をホバーすると、JButton[0][0]JButton[1][0]JButton[2][0]などの背景が変わります。私はbtn[i+1][j].setBackground(Color.black);をやって試してみましたが、それは[i+1][j][2][0][1][0]青...ではなく、設定しJButtonのマトリックスでイベントを作成するには?

@Override 
public void mouseEntered(MouseEvent me) { 
    JButton event = (JButton) me.getSource(); 
    int i = 0; 
    int j = 0; 
    btn[i][j] = event; 
    btn[i][j].setBackground(Color.blue); 
} 

@Override 
public void mouseExited(MouseEvent me) { 
    JButton event = (JButton) me.getSource(); 
    int i = 0; 
    int j = 0; 
    btn[i][j] = event; 
    btn[i][j].setBackground(Color.black); 

} 

for (int i = 0; i < 10; i++) { 
    for (int j = 0; j < 10; j++) { 
     btn[i][j] = new JButton(); 
     btn[i][j].addMouseListener(this); 
     btn[i][j].setBackground(Color.black); 
     panel.add(btn[i][j]); 
    } 
} 

とそのMouseListener:ここ

は私がJButton配列を作成する方法です。

私のプログラムを実行するとエラーはありません。

Here

上の写真は私がやろうとしているかを示しています。

+2

作業?あなたの投稿にエラーメッセージやスタックトレースがありますか? – MasterBlaster

+1

「イベント」オブジェクトを使用してその状態を変更するだけです。あなたがやっているように配列を(間違って)掘り下げる必要はありません。 –

+0

各ボタンに個別のActionListenerを割り当て、同じものを共有しないでください。 –

答えて

2

配列を参照する必要はありません。あなたがする必要があるのは、getSource()によって返されるボタンの状態を変更することだけです。例えば、

@Override 
public void mouseEntered(MouseEvent me) { 
    JButton event = (JButton) me.getSource(); 
    event.setBackground(Color.blue); 
} 

であり、同様にマウス脱出である。

あなたは

int i = 0; 
int j = 0; 
for (int i2 = 0; i2 < btn.length; i2++) { 
    for (int j2 = 0; j2 < btn[i2].length; j2++) { 
     if (event == btn[i2][j2]) { 
      i = i2; 
      j = j2; 
     } 
    } 
} 

// i and j set to appropriate value 

またはhereを行ったように似たボタンのクライアントのプロパティを取得および設定し、forループのネストされたとの配列を反復処理する、特定のマウスのためのiとjを知る必要がある場合。あなたはより詳細なヘルプが必要な場合は、そので、あなたが探しているメソッドがComponent.dispatchEvent(AWTEvent e)と呼ばれている有効なminimal example program

0

を作成して投稿し、私は1次元の例を思い付いた:ない何

package scratch.pad.ui; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.*; 
import java.util.List; 

/** 
* Propagate event to neighbor buttons 
*/ 
public class EventPropagation extends JFrame { 

    private List<JButton> buttons = new ArrayList<>(); 

    private class MouseEventPropagationListener extends MouseAdapter { 

     // The event source, for controlling the propagation of the event. 
     // To prevent infinite loop, we only dispatch the event to targets when 
     // e.getSource() == this.source; 
     private JButton source; 

     // Targets to propagate the event. 
     private java.util.List<JButton> targets; 

     public MouseEventPropagationListener(JButton source, JButton ... targets) { 
      this.source = source; 
      this.targets = Arrays.asList(targets); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      super.mouseEntered(e); 
      // Use this.source because e.getSource() could be different. 
      this.source.setBackground(Color.WHITE); 
      dispatchEvent(e); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      super.mouseExited(e); 
      this.source.setBackground(Color.BLACK); 
      dispatchEvent(e); 
     } 

     private void dispatchEvent(MouseEvent e) { 
      if (e.getSource() == source) { 
       for (JButton target : targets) { 
        target.dispatchEvent(e); 
       } 
      } 
     } 
    } 

    public EventPropagation() throws HeadlessException { 

     final int n = 10; 

     this.setTitle("Event propagation test"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.getContentPane().setLayout(new FlowLayout()); 

     this.setSize(300, 300); 

     this.setResizable(false); 

     // Create the buttons 
     for (int i = 0; i < n; i++) { 
      JButton btn = new JButton("Button " + i); 
      btn.setBackground(Color.BLACK); 
      this.buttons.add(btn); 
      this.getContentPane().add(btn); 
     } 

     // Setup propagation: 
     for (int i = 0; i < n; i++) { 
      JButton btn = this.buttons.get(i); 

      MouseEventPropagationListener listener = new MouseEventPropagationListener(btn, getNeighbors(i)); 
      btn.addMouseListener(listener); 
     } 
    } 

    private JButton [] getNeighbors(int i) { 
     List<JButton> neighbors = new ArrayList<>(); 

     if (i > 0) neighbors.add(this.buttons.get(i-1)); 
     if (i < this.buttons.size() - 1) neighbors.add(this.buttons.get(i + 1)); 

     return neighbors.toArray(new JButton[0]); 
    } 

    public static void main(String [] args) { 
     EventPropagation ep = new EventPropagation(); 
     ep.setVisible(true); 
    } 
} 
+1

@アルベルトを投稿してください。ボタンのバックグラウンドを設定する必要がある 'dispatchEvent(...)'メソッドを使う必要はありません。つまり、dispatchEvent()文を 'target.setBackground(source.getBackground());'に置き換えることができます。ループの外側で "if文"を取り除くことさえできます。元のコードの問題は、ホバートされたボタンの隣人を特定するロジックがなかったことです。あなたが隣人を知ったら、あなたはちょうど背景を設定します。 – camickr

関連する問題