简体   繁体   English

Java hang子手。 如何创建多个按钮和动作监听器?

[英]Java hangman. How to create multiple buttons and actionlisteners?

I am trying to create a hangman game with a button for each letter of the alphabet. 我正在尝试为每个字母字母的按钮创建一个for子手游戏。 I have done this the hard way, using absolute positioning and multiple actionlisteners. 我使用绝对定位和多个动作侦听器来完成此操作。 Is there any way I can do both with a for loop? 有什么办法可以同时使用for循环吗?

Also, how can I implement my hangman using a polymorphic array? 另外,如何使用多态数组实现我的子手? The way I have it now, I will use an if statement for each of the limbs. 现在,我将对每个分支使用if语句。 I'd wrather create the man on his own panel, then set the visibility for each limg to true as the use fails at guessing. 我会在他自己的面板上创建该人,然后将其设置为true,因为使用会导致猜测失败。

Any help is appreciated. 任何帮助表示赞赏。

public class HangmanGui extends JFrame{
    private JLabel headerLabel;
    private JPanel man;
    private Graphics gobj;

    private JButton aButton ;
    private JButton bButton ;
    private JButton cButton ;
    private  JButton dButton ;
    private  JButton eButton ;
    private  JButton fButton ;
    private  JButton gButton ;
    private  JButton hButton ;
    private  JButton iButton ;
    private  JButton jButton ;
    private  JButton kButton ;
    private  JButton lButton ;
    private  JButton mButton ;
    private  JButton nButton ;
    private  JButton oButton ;
    private  JButton pButton ;
    private  JButton qButton ;
    private  JButton rButton ;
    private  JButton sButton ;
    private  JButton tButton ;
    private  JButton uButton ;
    private  JButton vButton ;
    private  JButton wButton ;
    private  JButton xButton ;
    private  JButton yButton ;
    private  JButton zButton ;
    private  JButton newWButton ;
    private JButton showWButton ;
    private  JButton quitButton ;
    private  JButton startButton ;

    private JLabel blankWord;

    private JLabel titleWord;

    private JFrame frame;
    private JPanel hangman;
    private FlowLayout layout;
    private Container container;



    /*  
    public static void main (String[] args){
        GUITest gui = new GUITest();

        gui.setSize(800,900);
        gui.setVisible(true);

    }
 */ 
     //
    //   public GUITest()
   //  {



   //  }



    public HangmanGui(){
        buildGui();

    }





    public void buildGui(){
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setBackground(Color.WHITE);
        frame.setBounds(100, 100, 450, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        Font lblFont= new Font("Serif", Font.BOLD, 30); 
         JLabel[] uscore = new JLabel[15];

        Man man = new Man();

        titleWord = new JLabel("A Game of Hangman.");
        titleWord.setBounds(260,10,500,150);
        titleWord.setFont(lblFont);


        add(titleWord);
    //  add(blankWord);
        //frame.add(man);
        this.add(man);
        man.setBounds(100,100,400,400);
        JPanel panel = new JPanel();


        panel.setBounds(6, 232, 400, 400);
        frame.getContentPane().add(panel);



        layout = new FlowLayout();
         container = getContentPane();
         setLayout(null);


         aButton = new JButton("A");

         add(aButton);
         aButton.setBounds(30, 520, 50, 29);
        aButton.addActionListener(
                 new ActionListener()
                 {
                 @Override
                    public void actionPerformed(ActionEvent event)
                    {

                    }
                 }
                 );



           bButton = new JButton("B");
         add(bButton);
        bButton.setBounds(80, 520, 50, 29);
        bButton.addActionListener(
                 new ActionListener()
                 {
                 @Override
                    public void actionPerformed(ActionEvent event)
                    {

                    }
                 }
                 );
        cButton = new JButton("C");
     add(cButton);
    cButton.setBounds(130, 520, 50, 29);
    cButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    dButton = new JButton("D");
     add(dButton);
     dButton.setBounds(180, 520, 50, 29);
    dButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       eButton = new JButton("E");
     add(eButton);
    eButton.setBounds(230, 520, 50, 29);
    eButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    fButton = new JButton("F");
     add(fButton);
     fButton.setBounds(280, 520, 50, 29);
    fButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       gButton = new JButton("G");
     add(gButton);
    gButton.setBounds(330, 520, 50, 29);
    gButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    hButton = new JButton("H");
     add(hButton);
     hButton.setBounds(380, 520, 50, 29);
    hButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       iButton = new JButton("I");
     add(iButton);
    iButton.setBounds(430, 520, 50, 29);
    iButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    jButton = new JButton("J");
     add(jButton);
     jButton.setBounds(480, 520, 50, 29);
    jButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       kButton = new JButton("K");
     add(kButton);
    kButton.setBounds(530, 520, 50, 29);
    kButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    lButton = new JButton("L");
     add(lButton);
     lButton.setBounds(580, 520, 50, 29);
    lButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       mButton = new JButton("M");
     add(mButton);
    mButton.setBounds(630, 520, 50, 29);
    mButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    nButton = new JButton("N");
     add(nButton);
     nButton.setBounds(680, 520, 50, 29);
    nButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       oButton = new JButton("O");
     add(oButton);
    oButton.setBounds(30, 550, 50, 29);
    oButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    pButton = new JButton("P");
     add(pButton);
     pButton.setBounds(80, 550, 50, 29);
    pButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       qButton = new JButton("Q");
     add(qButton);
    qButton.setBounds(130, 550, 50, 29);
    qButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    rButton = new JButton("R");
     add(rButton);
     rButton.setBounds(180, 550, 50, 29);
    rButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       sButton = new JButton("S");
     add(sButton);
    sButton.setBounds(230, 550, 50, 29);
    sButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    tButton = new JButton("T");
     add(tButton);
     tButton.setBounds(280, 550, 50, 29);
    tButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       uButton = new JButton("U");
     add(uButton);
    uButton.setBounds(330, 550, 50, 29);
    uButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    vButton = new JButton("V");
     add(vButton);
     vButton.setBounds(380, 550, 50, 29);
    vButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       wButton = new JButton("W");
     add(wButton);
     wButton.setBounds(430, 550, 50, 29);
    wButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    xButton = new JButton("X");
     add(xButton);
     xButton.setBounds(480, 550, 50, 29);
    xButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
       yButton = new JButton("Y");
     add(yButton);
     yButton.setBounds(530, 550, 50, 29);
    yButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
    zButton = new JButton("Z");
     add(zButton);
     zButton.setBounds(580, 550, 50, 29);
    zButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );

     startButton = new JButton("Start Game");
     add(startButton);
     startButton.setBounds(100, 700, 120, 29);
    startButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );

     newWButton = new JButton("New Word");
     add(newWButton);
     newWButton.setBounds(250, 700, 120, 29);
    newWButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );
     showWButton = new JButton("Show Word");
     add(showWButton);
     showWButton.setBounds(400, 700, 120, 29);
    showWButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );

     quitButton = new JButton("Quit Game");
     add(quitButton);
     quitButton.setBounds(550, 700, 120, 29);
    quitButton.addActionListener(
             new ActionListener()
             {
             @Override
                public void actionPerformed(ActionEvent event)
                {

                }
             }
             );



}

} }

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;


public class Man extends JPanel {

     protected void paintComponent(Graphics g ){
                super.paintComponent(g);


       //gallows
           g.fillRect(10, 250, 150, 20);
           g.fillRect(40,70,10,200);
           g.fillRect(40,70,60,10);
           g.setColor(Color.yellow);
           g.fillRect(95,70,5,25);
          //head
           g.setColor(Color.black);
           g.drawOval(82,95,30,30);

           //body
           g.drawLine(97,125,97,150);
          //left leg
           g.drawLine(97,150,117,183);
           //right leg
          g.drawLine(97,150,77,183);
           // right arm
           g.drawLine(97,125,117,135);
           //left arm
           g.drawLine(97,125,77,135);




}

} }

You could try something like this: 您可以尝试这样的事情:

// create a JPanel to hold the buttons that uses a GridLayout with 3 rows
JPanel buttonPanel = new JPanel(new GridLayout(3, ));
for (int i = 0; i < 26; ++i)
{
    wButton = new JButton('A' + i);
    buttonPanel.add(wButton);
    // wButton.setBounds(30 + i * 50, 550, 50, 29); // avoid this
    wButton.addActionListener(
        new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent event)
            {

            }
        }
    );
}
// here add the buttonPanel to the main GUI

To break this down: 要对此进行分解:

1) We use a for loop to go thru the 26 letters of the alphabet. 1)我们使用for循环遍历字母表中的26个字母。

2) We create a button with the title being the letter. 2)我们创建一个按钮,标题为字母。 Because characters are actually just integers, adding 1 to 'A' yields 'B'. 因为字符实际上只是整数,所以将'A'加1会得到'B'。 So, we can use 'A'+i as a little trick. 因此,我们可以使用“ A” + i作为小技巧。 Also, you could use an array of all the letters instead and do something like letter[i] there. 另外,您可以使用所有字母的数组代替,并在其中执行诸如letter [i]之类的操作。

3) Avoid use of setBounds but rather use the layout managers to more easily and simply place and size the buttons. 3)避免使用setBounds,而是使用布局管理器更轻松,更简单地放置和调整按钮的大小。

Disclaimer: I haven't actually tested this, it's just something to get you on the right track. 免责声明:我尚未实际测试过,这只是使您步入正轨的方法。

Use a layout manager to manage the sizing of your buttons, don't use setBounds() . 使用布局管理器来管理按钮的大小,不要使用setBounds() You currently create one but don't set it and so its not used. 您当前正在创建一个,但未设置它,因此未使用它。

layout = new FlowLayout();
setLayout(null); // Why set null and not layout

Set the layout correctly and then you could can use a char in your for loop like 正确设置布局,然后可以在for循环中使用char

for(char c = 'A'; c <= 'Z'; c++)
{
    JButton button = new JButton("" + c);
    // add action listener also
    add(button); // adding will add it using the layout manager
}

You can learn more about layout managers here . 您可以在此处了解有关布局管理器的更多信息。

Suggestions: 意见建议:

  • Yes, use an array or a collection such as either a simple array of JButton or a List<JButton> or its concrete implementation, an ArrayList<JButton> 是的,使用数组或集合,例如JButton的简单数组或List<JButton>或其具体实现,即ArrayList<JButton>
  • Yes, create your letter JButtons in a for loop as many have suggested. 是的,正如很多人建议的那样,在for循环中创建字母JButton。
  • But don't create your special buttons there, buttons such as your reset button or your exit button. 但不要在此处创建特殊按钮,例如重置按钮或退出按钮之类的按钮。
  • Create one AbstractAction or ActionListener class for all the letter buttons to share and a unique AbstractAction or ActionListener class for each special JButton 为要共享的所有字母按钮创建一个AbstractAction或ActionListener类,并为每个特殊的JButton创建一个唯一的AbstractAction或ActionListener类
  • Use layout managers, but not just one -- nest them. 使用布局管理器,而不只是一个- 嵌套它们。 For instance, the overall GUI can use a BorderLayout with the drawing held BorderLayout.CENTER and the buttons in the SOUTH or PAGE_END position, the JPanels that hold your buttons could be held in a BoxLayout using JPanel, the letter buttons in a GridLayout using JPanel and the same for the specialty buttons. 例如,整个GUI可以使用BorderLayout,将图形保留在BorderLayout.CENTER上并将按钮置于SOUTH或PAGE_END位置,可以将保留按钮的JPanels使用JPanel保留在BoxLayout中,使用GridLayout的字母按钮使用JPanel与专业按钮相同。
  • Use a separate JPanel for drawing the hangman image. 使用单独的JPanel绘制drawing子手图像。 Keep its logic separate from everything else. 将其逻辑与其他所有事物分开。 All it cares about is the number of wrong letters guessed, and then it should draw the appropriate images depending on this value. 它只关心猜测的错误字母的数量,然后应根据该值绘制适当的图像。 So I'd give it a public method for incrementing this number as well as a public method for resetting the number and its drawing. 因此,我给它提供了一种公共方法来递增该数字,以及一种公共方法来重置数字及其图形。

For instance 例如

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class LayoutFoo extends JPanel {

   // using a List of JButtons to hold my collection
   private List<JButton> letterButtons = new ArrayList<>();
   private DrawingPanel drawingPanel = new DrawingPanel();

   public LayoutFoo() {
      JPanel letterButtonPanel = new JPanel(new GridLayout(3, 0, 3, 3));
      letterButtonPanel.setBorder(BorderFactory.createTitledBorder("Letters"));
      ButtonListener buttonListener = new ButtonListener();
      for (char c = 'A'; c <= 'Z'; c++) {
         String text = String.valueOf(c);
         JButton button = new JButton(text);
         button.addActionListener(buttonListener);
         letterButtons.add(button); // add JButton to List<JButton>
         letterButtonPanel.add(button);  // and add to GridLayout-using JPanel
      }

      // JPanel to hold non-letter JButtons
      JPanel specialBtnsPanel = new JPanel(new GridLayout(1, 0, 3, 3));
      specialBtnsPanel.add(new JButton(new ResetAction("Reset", KeyEvent.VK_R)));
      specialBtnsPanel.add(new JButton(new ExitAction("Exit", KeyEvent.VK_X)));


      // JPanel to hold non-drawing JPanels. It uses BoxLayout
      JPanel bottomPanel = new JPanel();
      bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.PAGE_AXIS));
      bottomPanel.add(letterButtonPanel);
      bottomPanel.add(specialBtnsPanel);

      // set layout and border of main JPanel and add other JPanels to it
      setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
      setLayout(new BorderLayout(3, 3));
      add(drawingPanel, BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
   }

   private class ButtonListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         System.out.println("Button pressed: " + e.getActionCommand());
         ((AbstractButton) e.getSource()).setEnabled(false);
      }
   }

   private class ResetAction extends AbstractAction {
      public ResetAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         for (JButton button : letterButtons) {
            button.setEnabled(true);
         }
      }
   }

   private class ExitAction extends AbstractAction {
      public ExitAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         Component component = (Component) e.getSource();
         Window win = SwingUtilities.getWindowAncestor(component);
         win.dispose();
      }
   }

   private static void createAndShowGui() {
      LayoutFoo mainPanel = new LayoutFoo();

      JFrame frame = new JFrame("LayoutFoo");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class DrawingPanel extends JPanel {
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;
   private int wrongLetterCount = 0;

   public DrawingPanel() {
      setBorder(BorderFactory.createTitledBorder("Hang Man"));
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);

      // TODO: draw hangman here based on wrong letter count!
   }

   public void incrementWrongLetterCount() {
      wrongLetterCount++;
      repaint();
   }

   public void reset() {
      wrongLetterCount = 0;
      repaint();
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM