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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不创建实际新按钮的情况下创建在不同位置执行相同操作的多个按钮?相关的知识,希望对你有一定的参考价值。

我是java和编程的新手。在学校里,我决定开展一个项目来提高我的成绩,因为简单的java目前是我的主题,我决定尝试使用swing在jframe中重建战列舰。到目前为止,我已经取得了一些进展,但我坚持一个生活质量问题。

基本上,在我们使用的编辑器(Java Editor(javaeditor.org))中,我使用swing在jframe中实现按钮等。因为我需要很多按钮用于游戏gui,我想要这样做,所以我不必制作几个必须用参数填充的按钮。我试图做的是有一些参数为我创建几个按钮所以他们实际上都不需要他们自己的“方法”,因为所有按钮必须基本上做同样的事情。

我试图在谷歌搜索类似的东西,但我找不到任何东西,所以我决定创建这个帐户,询问是否有人可以帮助我解决这个问题。如果有什么不可理解的话随意问(英语不是我的母语,所以有些部分可能很难理解)。

期待任何回复!在此先感谢您的帮助。

最初我认为我可以使用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个按钮,同时保持构造函数中的代码行尽可能短。

答案

如果你想要一个按钮网格,然后在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和null布局。

关于:

....没有创建新的JButtons

如果你想要一个功能齐全的按钮(而不是在JTable中创建渲染按钮),这在技术上是不可能的,但是,按钮可以共享ActionListeners,所以所有按钮都做同样的事情(想想 - 所有数字按钮)在计算器上)可以使用完全相同的ActionListener。或者,您可以使用自己的类来设置按钮的Action,该类从AbstractAction扩展,以获得更大的灵活性和功能,并且多个按钮(和JMenuItems)可以共享相同的操作。

以上是关于如何在不创建实际新按钮的情况下创建在不同位置执行相同操作的多个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在不创建新视图或知道特定父视图的情况下向 UIButton 类添加约束

在不取消当前 SQL 语句的情况下创建新的 SQL 语句

需要在不使用管理工作室的情况下创建新数据库

如何在不重新加载页面的情况下更改 URL?

如何在不打开新命令行窗口的情况下使用“schtasks”执行计划任务?

如何在不创建新片段的情况下显示片段?