用Java翻转硬币

  • 本文关键字:硬币 翻转 Java java
  • 更新时间 :
  • 英文 :


我正在用Java编写一个GUI程序。GUI由9个标题为H.的按钮组成。在运行模式下,当鼠标单击任何按钮时,该按钮都会将标题更改为T。我有一个MouseListener代码来监视单击。但是我没有办法根据鼠标点击来发现我需要更改那个特定的按钮。感谢您的帮助
下面是我的代码。

package flippingcoins;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class FlippingCoins extends JFrame
{
    public FlippingCoins()
    {
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(3,3,1,1));
        JButton jbt1=new JButton("H");
        p.add(jbt1);
        JButton jbt2=new JButton("H");
        p.add(jbt2);
        JButton jbt3=new JButton("H");
        p.add(jbt3);
        JButton jbt4=new JButton("H");
        p.add(jbt4);
        JButton jbt5=new JButton("H");
        p.add(jbt5);
        JButton jbt6=new JButton("H");
        p.add(jbt6);
        JButton jbt7=new JButton("H");
        p.add(jbt7);
        JButton jbt8=new JButton("H");
        p.add(jbt8);
        JButton jbt9=new JButton("H");
        p.add(jbt9);
        add(p);
    }
    public static void main(String[] args) //Main program begins here.
    {
        FlippingCoins frame = new FlippingCoins();//Instantiating an object.
        frame.setTitle("Head or Tails");//Setting the frame title.
        frame.setSize(300,300);//Setting the size.
        frame.setLocationRelativeTo(null);//Setting the location.
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Default closing options.
        frame.setVisible(true);//Setting visibility to true.
    }//End of main program.
    static class ChangeTiles extends JPanel
    {
        public ChangeTiles()
        {
        addMouseListener(new MouseAdapter()//Creating a listener
        {
            public void mouseClicked(MouseEvent e)//When the mouse is clicked.
            {
              int x=e.getX();
              int y=e.getY();
              System.out.println("x= "+ x + "y= "+y);
            }
        }
                        ); 
        }
    }

这不是一个好策略。相反,为每个按钮添加一个ActionListener。这不仅会容易得多,而且用户还可以使用键盘点击按钮。

此外,还可以考虑使用按钮的数组或列表。这将允许使用循环,而不是复制和粘贴相同的代码9次。

public FlippingCoins() {
    final JPanel p = new JPanel();
    p.setLayout(new GridLayout(3, 3, 1, 1));
    for (int i = 0; i < 9; i++) {
        final JButton jbt = new JButton("H");
        jbt.setName("" + i);
        jbt.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                jbt.setText("T");
                System.out.println(jbt.getName());
            }
        });
        p.add(jbt);
    }
    setContentPane(p);
}

一些注意事项:

  • 对重复任务使用循环
  • 监听器必须被添加到他们应该监听的小部件中
  • 不要将MouseListener s用于JButton,存在ActionListener

JLabel的替代方案

public FlippingCoins2() {
    final JPanel p = new JPanel();
    p.setLayout(new GridLayout(3, 3, 1, 1));
    for (int i = 0; i < 9; i++) {
        final JLabel jlb = new JLabel("H", SwingConstants.CENTER);
        jlb.setBorder(BorderFactory.createLineBorder(Color.blue));
        jlb.setName("" + i);
        jlb.addMouseListener(new MouseAdapter() {
            public void mouseClicked(final MouseEvent e) {
                jlb.setText("T");
                System.out.println(jlb.getName());
            }
        });
        p.add(jlb);
    }
    setContentPane(p);
}

这就是你应该做的:

JButton jbt1=new JButton("H");
jbt1.addActionListener(new ButtonListener());
//add ButtonListener to all of the other buttons
//Somewhere in your code:
public class ButtonListener extends ActionListener {
    public void actionPerformed(ActionEvent e) {
        JButton source = (JButton) e.getSource();
        source.setText("T");
    }
}

如果添加ActionListener,这将很容易。在actionPerformed代码中,你可以让它打印出点击了哪个按钮。

getSource()
Returns: The object on which the Event initially occurred.

可以对ActionPerformed方法生成的ActionEvent调用getSource()。我还没有尝试过,但听起来你可以很容易地找到点击了哪个按钮。

最新更新