在Java中翻转硬币

时间:2013-12-07 18:49:26

标签: 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);

            }
        }
                        ); 
        }
    }

4 个答案:

答案 0 :(得分:5)

这不是好策略。而是为每个按钮添加ActionListener。它不仅更容易,而且用户也可以使用键盘点击按钮。

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

答案 1 :(得分:1)

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用于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);
}

答案 2 :(得分:0)

这是你应该怎么做的:

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");
    }
}

答案 3 :(得分:0)

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

getSource()

Returns: The object on which the Event initially occurred.

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