0

この小さなプログラムの機能は次のとおりです。ボタンをクリックし、赤い枠のボタンをクリックしてアクションを変更します (ボタンの色を赤い枠のボタンから青い枠のボタンに変更します)...しかし、JOptionPane でさえ問題ありません。私がなんとか行動を変えることができる限り。

Panel クラスのレビュー済みコードを見つけてください:....まだ動作していません。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Panel 
{

    private JButton[][] bu1 = new JButton[10][10];
    public Panel(JFrame frame)
    {   
        super();

        JPanel pCenter = new JPanel();
        JPanel pTop = new JPanel();

        frame.add(pCenter, BorderLayout.CENTER);
        frame.add(pTop, BorderLayout.NORTH);

        JPanel Grid10x10 = new JPanel(new GridLayout(10,10));

        pCenter.add(Grid10x10);

        for(int c = 0; c< 10; c++)
        {
            for (int r = 0; r< 10; r++)
            {
                bu1[c][r] = new JButton("X");
                Grid10x10.add(bu1[c][r]);

                final int i = c;
                final int j = r;

                ActionListener[] listeners = bu1[i][j].getActionListeners();
                for (ActionListener l : listeners) 
                {
                bu1[i][j].removeActionListener(l);
                }

                bu1[i][j].addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {
                        int f = (3-1);

                        Object redButton = new Object();
                        if(e.getSource() == redButton)
                        {
                        JOptionPane.showMessageDialog(null,"row ");
                        }

                        bu1[i][j].setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));

                        if ((j+f)<=9)
                        {
                            bu1[i][j+f].setBorder(BorderFactory.createLineBorder(Color.RED, 2));
                            redButton = bu1[i][j+f];

                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null,"move your 1st click more to the center");
            }

                    }
                });
            }
        }
    }
}

積みました!私はJavaに比較的慣れていないので、Webを検索して問題を解決できませんでしたが、今こそあなたの助けを求める時です。

JButtonの配列を2回クリックした後、アクションリスナー(actionPerformed)を変更する方法がわかりません...(実際にはわかりません)。以下のコードを見つけて、私を導くことができます。

グリッドを最初にクリックすると、クリックしたボタンの境界線が「青」に変わり、別のボタンの境界線が「赤」に変わります。ボタンの色を「赤」から「青」ボタンに変更するとします。

あなたの助けは大歓迎です!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class ChangeGrid
{

    private JButton[][] bu1 = new JButton[10][10];
    public ChangeGrid(JFrame frame)
    {
        super();

        JPanel pCenter = new JPanel();
        JPanel pTop = new JPanel();

        frame.add(pCenter, BorderLayout.CENTER);
        frame.add(pTop, BorderLayout.NORTH);

        JPanel Grid10x10 = new JPanel(new GridLayout(10,10));

        pCenter.add(Grid10x10);

        for(int c = 0; c< 10; c++)
        {
            for (int r = 0; r< 10; r++)
            {
                bu1[c][r] = new JButton("X");
                Grid10x10.add(bu1[c][r]);

                final int i = c;
                final int j = r;

                bu1[i][j].addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {
                        int f = (3-1);

                        bu1[i][j].setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));

                        if ((j+f)<=9)
                        {
                            bu1[i][j+f].setBorder(BorderFactory.createLineBorder(Color.RED, 2));
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null,"move your 1st click more to the center");
            }
                    }
                });
            }
        }
    }
}

import javax.swing.JFrame;
public class GUIFrame extends JFrame
{
    public GUIFrame()
    {
        super("Grid 10 x 10");

        this.setSize(1350, 700);
        this.setVisible(true);
        this.setResizable(true);
        this.setDefaultCloseOperation(GUIFrame.EXIT_ON_CLOSE);
    }
}

import javax.swing.JFrame;
public class Main
{
    public static void main(String args[])
        {

            JFrame frame = new GUIFrame();
            ChangeGrid pC = new ChangeGrid(frame);
            frame.pack();
        }

}
4

3 に答える 3

1

最終目標は明確ではありませんが、アクション リスナーを変更するには、まず現在のリスナーを削除して新しいリスナーを追加する必要があります。

ActionListener[] listeners = bu1[i][j].getActionListeners();
for (ActionListener l : listeners) {
    bu1[i][j].removeActionListener(l);
}
bu1[i][j].addActionListener(new ActionListener() {
...
});

ただし、赤くなったボタンへの参照を別の変数に保持する方がよい場合があります。アクションリスナーを変更する代わりに、現在のボタンが現在赤いボタンであるかどうかを確認するだけです

public void actionPerformed(ActionEvent e)
{
    ...
    if(e.getSource() == redButton){
        //do something with red button
    }
    if ((j+f)<=9)
    {
        bu1[i][j+f].setBorder(BorderFactory.createLineBorder(Color.RED, 2));
        redButton = bu1[i][j+f];
    }
    ...
}
于 2014-08-03T00:22:44.060 に答える
0

おそらく、MouseListener を使用できます。MouseListener には getClickCount() があり、使用できます。

if(e.getClickCount()==1)
{

}


if(e.getClickCount()==2)
{


}
于 2014-08-03T01:19:04.647 に答える