Java将按钮动态添加为数组[重复]

Posted

技术标签:

【中文标题】Java将按钮动态添加为数组[重复]【英文标题】:Java add buttons dynamically as an array [duplicate] 【发布时间】:2012-12-06 10:52:04 【问题描述】:

可能重复:java - How would I dynamically add swing component to gui on click?

我想动态添加按钮数组。 我试过这样:

this.pack();
    Panel panel = new Panel();
    panel.setLayout(new FlowLayout());
    this.add(panel);
    panel.setVisible(true);
    for (int i = 0; i < Setting.length; i++) 
        for (int j = 0; j < Setting.width; j++) 
            JButton b = new JButton(i+"");
            b.setSize(30, 30);
            b.setLocation(i * 30, j * 30);
            panel.add(b);
            b.setVisible(true);
        
    

但什么都没得到,我犯了什么错误?

编辑

我有 jFrame 类“选择”我有一个按钮,当我按下按钮时,这应该会发生:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
        // TODO add your handling code here:
       structure.Setting s = new Setting(8, 8, 3, 1, 1);
       Game g = new Game();
       g.setSetting(s);
       this.dispose();
       g.show();
    

然后我去Game类(也是jFrame类)到函数setSetting,它是这样的:

void setSetting(Setting s) 
        this.setting = s;
        structure.Game game = new structure.Game(setting);
        JPanel panel = new JPanel(new GridLayout(5, 5, 4, 4));
        for (int i = 1; i <= 5; i++) 
            for (int j = 1; j <= 5; j++) 
                JButton b = new JButton(String.valueOf(i));
                panel.add(b);
            
        
        add(panel);
        pack();
        setVisible(true);
    
    structure.Setting setting;

【问题讨论】:

Setting.lengthwidth 是什么? @irrelephant setting.length 返回数字 8 【参考方案1】:

JPanel 已经在布局管理器的控制之下,设置按钮的大小和位置无关紧要,因为一旦面板被验证,它们就会改变。

尝试在您使用按钮填充面板之后添加面板..

更新示例

没有进一步的证据,我们只是猜测……现在有两个人没有问题。

Panel panel = new Panel();
for (int i = 0; i < Setting.length; i++) 
    for (int j = 0; j < Setting.width; j++) 
        jButton b = new jButton(i + "");
        panel.add(b);
    

this.add(panel);

public class BadBoy 

    public static void main(String[] args) 
        new BadBoy();
    

    public BadBoy() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());

                int buttonCount = (int) Math.round(Math.random() * 20);
                int columnCount = (int) Math.round(Math.random() * 20);
                JPanel buttonPane = new JPanel(new GridLayout(0, columnCount));
                for (int i = 0; i < buttonCount; i++) 
                    JButton b = new JButton(i + "");
                    buttonPane.add(b);
                

                frame.add(buttonPane);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class ButtonPane extends JPanel 

        public ButtonPane() 
        
    

【讨论】:

我照你说的做了,但还是一无所有:( :( 那么你的问题出在哪里,你需要分享更多的代码。您需要提供一个SSCCE,我们可以运行它来演示您面临的特定问题。 我给你的代码是我所有的代码,实际上它只是一个 jFrame,我试图在循环上打印一些东西,它确实如此循环正在工作 好吧,现在,你有两个可以产生输出的人,但是没有你的问题的工作示例,我们只是猜测出了什么问题 AVD 最先到达那里,只是公平【参考方案2】:

您可以使用GridLayout 添加等高/等宽按钮:

public class Game extends JFrame 
    private JPanel panel;
    public Game(int rows,int cols,int hgap,int vgap)
        panel=new JPanel(new GridLayout(rows, cols, hgap, vgap));
        for(int i=1;i<=rows;i++)
        
            for(int j=1;j<=cols;j++)
            
                JButton btn=new JButton(String.valueOf(i));
                panel.add(btn);
            
        
        add(panel);
        pack();
        setVisible(true);
    

按钮处理程序中的代码应该是:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
   Game g = new Game(5,5,3,3);

请注意,您也可以通过Game 构造函数(当您可以动态添加小部件时)传递Setting 对象引用,而不是调用setSetting 方法。

【讨论】:

cmets 在哪里?我看不到你是否在写 我想建议你应该通过Game类的构造函数参数传递settings 请看这里的代码,它只是在游戏类中,我从选择类中调用它,非常简单mediafire.com/download.php?96cj26hlxb7nxl4 我做了这个:在调用我的游戏类时,我调用了你的测试类,它可以工作:) 非常感谢你 @tottiroma - 我已经删除/标记了非建设性的 cmets。【参考方案3】:
Try to use setBounds(x,y,width,heigth) method

setBound方法

for (int i = 0; i < 1; i++) 
                for (int j = 0; j <1; j++) 
                    JButton b = new JButton("button");
                    b.setBounds(500, 500, 100, 20);               
                    this.add(b);

               
            


this.repaint();
this.validate()

【讨论】:

我在panel.add(b);之后添加了你说的内容,但仍然没有;(【参考方案4】:

我猜this 是延伸还是某种框架?

第一步是通过this.pack();设置框架大小来打包框架,使其适合所有对象。

我假设您已将其设置为可见?

现在您应该可以看到按钮了。 如果您想要不同的布局,请使用panel.setLayout(new SomeLayout);

【讨论】:

this 是 jFrame,我按照你说的尝试了(查看编辑后的代码),但仍然一无所获

以上是关于Java将按钮动态添加为数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将项目动态添加到 TableView 导致重复单元格

PHP如何动态为多维数组的子数组分别添加元素

Python动态添加按钮分别管理[重复]

java Jtable 如何动态添加button按钮

使用javascript单击div内的x按钮动态添加和删除div [重复]

js 如何动态添加数组