1

私は(今のところ)幅25マス、下に12マスのグリッドを作成し、クリックすると2色を切り替えるようにしようとしています(デフォルトではすべての四角は青で、1つをクリックすると赤になります。別のクリックで再び青に戻ります)

私は長い間 Swing のことをしていませんでした。これは、私の Android アプリの非常に基本的なレベルの設計ツールになるでしょう。それは「ちょっと」機能しますが、何らかの理由でマウスの位置が少し「ずれている」ようです。

これはスクリーンショットです:

ここに画像の説明を入力

あなたが見ることができるマウスポインターは、私がクリックした場所であり、赤い四角は色が変わったものです(x位置もずれていますが、「y」ほどではありません).

なぜこれが起こっているのですか?助けていただければ幸いです。

コード(JPanels を「myFrames」と呼んで混乱を招いてしまったことをお詫びします ;-) )

public class GUI extends JFrame implements MouseListener{

JFrame myFrame = new JFrame();
JLabel myPanels[];

    public GUI(){

        super("Grid");
        setSize(1000,400);
        setResizable(false);
        setLayout(new GridLayout(12,25));
        addMouseListener(this);

        myPanels = new JLabel[300];

        for (int x = 0;x<myPanels.length;x++){

            myPanels[x]=new JLabel("");
            myPanels[x].setOpaque(true);
            myPanels[x].setBackground(Color.BLUE);
            myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
        }
//Add all the squares (JLabels)
        for (int x = 0;x<myPanels.length;x++)
        add(myPanels[x]);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    //iterate through all JPanels to determine clicked one  
        for (int x = 0;x<myPanels.length;x++){
        if (e.getX()>myPanels[x].getX()&&e.getX()<(myPanels[x].getX()+myPanels[x].getWidth()))

        {

            if(e.getY()>myPanels[x].getY()&&e.getY()<(myPanels[x].getY()+myPanels[x].getHeight())){
        //Toggle colours    
        if (myPanels[x].getBackground()==Color.blue)
        myPanels[x].setBackground(Color.red);

        else {myPanels[x].setBackground(Color.blue);}
          }
        }
       }
     }



}
4

2 に答える 2

2

JFrame (つまり、ウィンドウ) にクリック リスナーが追加されるため、マウス座標は、グリッドの左上隅ではなく、ウィンドウの左上隅を基準にします。

どのグリッド要素がクリックされたかを把握したい場合は、JFrame 全体ではなく、各グリッド パネルにクリック リスナーを追加する方が簡単な場合があります。

    for (int x = 0;x<myPanels.length;x++){

        myPanels[x]=new JLabel("");
        myPanels[x].setOpaque(true);
        myPanels[x].setBackground(Color.BLUE);
        myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
        myPanels[x].addMouseListener(this); // <-- add same listener to each grid
    }

リスナーを次のように変更します

@Override
public void mouseClicked(MouseEvent e) {
    JLabel clickedPanel = (JLabel) e.getSource();

    //Toggle colours    
    if (clickedPanel.getBackground()==Color.blue)
        clickedPanel.setBackground(Color.red);
    else 
        clickedPanel.setBackground(Color.blue);
}
于 2013-07-09T14:46:12.663 に答える
1

私は(今のところ)幅25マス、下に12マスのグリッドを作成し、クリックすると2色を切り替えるようにしようとしています(デフォルトではすべての四角は青で、1つをクリックすると赤になります。別のクリックで再び青に戻ります)

  • 使用するJToggleButton.setBackground(Color.Xxx)場合JToggleButton.isSelected()

  • 最後に選択したものをローカル変数 (文字列) に追加し、

  • 前のポイントのすべての座標はget/putClientProperty()に基づいており、コンテナから内部をループし、ローカル変数に含まれているかどうか、等しい場合はJComponentsテストしますString

  • ところで と同じですJPanelが、JToggleButtonを追加せずに を使用するのが最も簡単Listenerです。さらに、Colorsの 2 つの可能な状態の 2つを直接JToggleButton定義できるためです。UIManager

于 2013-07-09T15:09:03.130 に答える