Джавский палач. Как создать несколько кнопок и прослушивателей действий?

Я пытаюсь создать игру палача с кнопкой для каждой буквы алфавита. Я сделал это трудным путем, используя абсолютное позиционирование и несколько прослушивателей действий. Есть ли способ сделать это с помощью цикла for?

Кроме того, как я могу реализовать своего палача с помощью полиморфного массива? Как у меня сейчас, я буду использовать оператор if для каждой из конечностей. Я бы предпочел создать человека на его собственной панели, а затем установить для каждой конечности значение true, поскольку использование не позволяет угадать.

Любая помощь приветствуется.

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




}

}


person John Casey    schedule 21.04.2015    source источник
comment
"how can I implement my hangman using a polymorphic array?" -- что такое полиморфный массив? Я никогда не слышал об этом термине и понятия не имею, что вы имеете в виду. Почему бы просто не использовать массив?? Скажем, массив JButton -- JButton[]? Что произошло, когда вы попробовали это?   -  person Hovercraft Full Of Eels    schedule 21.04.2015
comment
Прости. Это термин, которым разбрасывается мой профессор. Полиморфный массив, по словам моего профессора, хранит различные состояния объекта. Например, лаять, мяукать или рычать для суперкласса Speak.   -  person John Casey    schedule 21.04.2015
comment
Каждый экземпляр JButton несет свое собственное состояние, поэтому простого массива должно быть более чем достаточно.   -  person MadProgrammer    schedule 21.04.2015
comment
Да, но как это будет выглядеть? Буду ли я использовать цикл for?   -  person John Casey    schedule 21.04.2015
comment
Да, используйте цикл for.   -  person Hovercraft Full Of Eels    schedule 21.04.2015


Ответы (3)


Используйте менеджер компоновки для управления размером ваших кнопок, не используйте setBounds(). В настоящее время вы создаете его, но не устанавливаете, поэтому он не используется.

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

Установите макет правильно, и тогда вы сможете использовать char в цикле for, например

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
}

Вы можете узнать больше о менеджерах макетов здесь.

person Java Devil    schedule 21.04.2015

Вы можете попробовать что-то вроде этого:

// 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

Чтобы разбить это:

1) Мы используем цикл for, чтобы просмотреть 26 букв алфавита.

2) Мы создаем кнопку с заголовком в виде буквы. Поскольку символы на самом деле представляют собой просто целые числа, добавление 1 к «А» дает «В». Итак, мы можем использовать 'A'+i как небольшой трюк. Кроме того, вместо этого вы можете использовать массив всех букв и сделать там что-то вроде буквы [i].

3) Избегайте использования setBounds, а используйте менеджеры компоновки для более легкого и простого размещения и размера кнопок.

Отказ от ответственности: я на самом деле не проверял это, это просто то, что поможет вам на правильном пути.

person Daniel Centore    schedule 21.04.2015
comment
установить границы? Давай сейчас, ничего из этого, пожалуйста. Если вы собираетесь рекомендовать новичкам, сделайте это полезной рекомендацией, например, поместите JButtons в GridLayout с помощью JPanel. - person Hovercraft Full Of Eels; 21.04.2015
comment
@HovercraftFullOfEels Я только что воссоздал код OP, используя цикл for, как они просили. Я не стал комментировать, насколько это правильно. - person Daniel Centore; 21.04.2015
comment
Тогда я называю это своей неадекватностью в вашем посте. Пожалуйста, улучшите рекомендацию. - person Hovercraft Full Of Eels; 21.04.2015
comment
Что ж, кое-что получилось. К сожалению, кнопка заняла весь экран. - person John Casey; 21.04.2015
comment
Я позволил себе улучшить ваш ответ, тем самым позволив мне снять свой отрицательный голос и дать вам положительный голос. Да, я был ярым сторонником, но если мы посоветуем оригинальному автору придерживаться нулевых макетов и setBounds, он создаст очень уродливые жесткие, очень негибкие графические интерфейсы, которые, хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или разрешения экрана, которые очень сложно обновлять и поддерживать. - person Hovercraft Full Of Eels; 21.04.2015

Предложения:

  • Да, используйте массив или коллекцию, например, простой массив JButton или List<JButton>, или его конкретную реализацию, ArrayList<JButton>
  • Да, создайте свою букву JButtons в цикле for, как многие предлагали.
  • Но не создавайте там свои специальные кнопки, такие как кнопка сброса или кнопка выхода.
  • Создайте один класс AbstractAction или ActionListener для всех кнопок с буквами и уникальный класс AbstractAction или ActionListener для каждой специальной кнопки JButton.
  • Используйте менеджеры компоновки, но не один — вложите их. Например, общий графический интерфейс может использовать BorderLayout с рисунком, удерживаемым BorderLayout.CENTER, и кнопками в позиции SOUTH или PAGE_END, панели JPanel, которые содержат ваши кнопки, могут храниться в BoxLayout с использованием JPanel, кнопки с буквами в GridLayout с использованием JPanel. и то же самое для специальных кнопок.
  • Используйте отдельную панель JPanel для рисования изображения палача. Держите его логику отдельно от всего остального. Все, что его волнует, — это количество угаданных неправильных букв, а затем он должен отрисовывать соответствующие изображения в зависимости от этого значения. Поэтому я бы дал ему общедоступный метод для увеличения этого числа, а также общедоступный метод для сброса числа и его рисования.

Например

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();
   }
}
person Hovercraft Full Of Eels    schedule 21.04.2015