如何创建在不同位置执行相同操作的多个按钮,而不创建实际的新按钮?

时间:2019-05-01 10:49:38

标签: java swing jframe

对于Java和整个编程来说,我真的是新手。在学校里,我决定进行一个项目来提高自己的成绩,由于简单的Java目前是我们的主题,所以我决定尝试使用swing在jframe中重新创建战舰。到目前为止,我已经取得了一些不错的进步,但是我陷入了生活质量问题。

因此,基本上,在编辑器中,我们使用(Java Editor(javaeditor.org)),我使用swing在jframe中实现按钮等。由于我需要为游戏gui设置很多按钮,因此我想这样做,因此我不必制作几个必须用参数填充的按钮。我想做的是让一些参数为我创建几个按钮,因此它们实际上都不需要自己的“方法”,因为所有按钮必须基本上执行完全相同的操作。

我尝试在Google上搜索类似的内容,但找不到任何内容,因此我决定创建此帐户,以询问是否有人可以帮助我解决此问题。如果有些事情无法理解,请随时问(英语不是我的母语,所以某些部分可能很难理解)。

期待任何答复!预先感谢您的帮助。

起初我以为我可以使用for循环来创建这些多个按钮,但ActionPerformed参数始终会出现某种错误。

for (int i = 0;i > 25;i++ ) {
      jButton[i].setBounds(48, 48 + i, 113, 73);
      jButton[i].setText("jButton1");
      jButton[i].setMargin(new Insets(2, 2, 2, 2));
      jButton[i].addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent evt) { 
          jButton[i]_ActionPerformed(evt);
      }
    });
      cp.add(jButton[i]);  
    }

正如已经说过的那样,我希望会有多个按钮,同时使构造函数中的代码行尽可能短。

1 个答案:

答案 0 :(得分:1)

如果需要按钮网格,则在for循环中创建它们,然后使用GridLayout将它们放置在JPanel中。这样的事情可能会起作用:

import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class ManyButtons extends JPanel {
    private static final int SIDES = 10;
    private JButton[][] buttonGrid = new JButton[SIDES][SIDES];

    public ManyButtons() {
        setLayout(new GridLayout(SIDES, SIDES));
        for (int row = 0; row < buttonGrid.length; row++) {
            for (int col = 0; col < buttonGrid[row].length; col++) {
                String text = String.format("[%d, %d]", col + 1, row + 1);
                buttonGrid[row][col] = new JButton(text);
                buttonGrid[row][col].addActionListener(event -> {
                    String command = event.getActionCommand();
                    System.out.println("Button pressed: " + command);
                });
                add(buttonGrid[row][col]);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        ManyButtons mainPanel = new ManyButtons();
        JFrame frame = new JFrame("Many Buttons");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

还应避免使用setBounds和空布局。

关于:

  

....而不创建新的JButtons

如果您想要一个功能齐全的按钮(而不是在JTable中创建呈现的按钮),从技术上讲是不可能的,但是 ,这些按钮可以共享ActionListener,因此所有执行相同功能的按钮事物(想想-计算器上的所有数字按钮)都可以使用相同的ActionListener。另外,您可以使用从AbstractAction扩展来的类来设置按钮的Action,以提供更大的灵活性和功能,并且多个按钮(和JMenuItems)可以共享同一操作。