【问题标题】:Change actionListener (actionPerformed) on second click在第二次单击时更改 actionListener (actionPerformed)
【发布时间】:2014-08-02 23:59:21
【问题描述】:

这个小程序的功能是: 单击一个按钮,单击红色边框按钮并更改操作(更改按钮的颜色 - 从红色边框按钮到蓝色边框按钮)...但即使 JOptionPane 也可以,只要我设法更改行动。

请查找面板类的已审核代码:....它仍然无法正常工作。

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 比较陌生,我已经在网上搜索了几天来解决我的问题,但没有成功,现在是时候寻求你的帮助了。

我不能...(实际上不知道)如何在第二次单击 JButtons 数组后更改动作侦听器(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();
        }

}

【问题讨论】:

  • 你能解释一下到底需要什么吗?我不明白你的话。
  • 将动作分配给按钮,每个按钮将执行自己的工作。似乎有什么问题?
  • 运行程序,单击一个按钮,单击红色边框按钮并更改操作(更改按钮的颜色 - 从红色边框按钮到蓝色边框按钮)...但即使是 JOptionPane没关系,只要我设法改变动作。
  • 理论上,你可以在actionPerformed方法中调用bu1[i][j].removeActionListener(this);,然后通过调用bu1[i][j].addActionListener添加一个新的。但这是可怕的设计。也许您应该在某处表示按钮的状态(可能在Color borderColors[][] 之类的数组中),然后相应地修改此状态,但这只是迄今为止基于(模糊)描述的猜测。 ..
  • @PM77-1..你能指导我怎么做吗?

标签: java actionlistener actionevent


【解决方案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];
    }
    ...
}

【讨论】:

  • 我按照您的建议做了,但没有奏效。唯一的区别是我必须将“redButton”声明为 Object。请查找面板类的已审核代码:
【解决方案2】:

也许你可以使用 MouseListener,MouseListener 有 getClickCount(),你可以使用

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

}


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


}

【讨论】:

  • 有人建议我不要在 JButtons 上使用 MouseListner...仍然感谢您的评论!
【解决方案3】:

另一种解决方案是使用 propertyChangeListener

制作你自己的财产,示例代码

button.addPropertyChangeListener("grid",new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
              System.out.println(evt.getNewValue());
          }
      });

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2011-01-05
    • 2022-11-11
    相关资源
    最近更新 更多