2012-03-27 152 views
1

在NetBeans中,我使用了GUI编辑器来创建JFrame,并且在框架中放置了一个JPanel。 目前,我正试图在类构建时在面板中创建一个新按钮。 这是我的代码,但我似乎无法得到它的工作。 (第一行,使按键之外,其他线路尽量表现出来。)如何动态添加JButton到JPanel?

this.jPanel2.add(new JButton("Test"),BorderLayout.NORTH); 
this.jPanel2.validate(); 
this.jPanel2.revalidate(); 
this.jPanel2.repaint(); 
this.jPanel2.setVisible(true); 
this.revalidate(); 
this.setVisible(true); 
this.repaint(); 

我一直在谷歌上搜索了一夜,但似乎无法得到它的工作。

+0

1)为了更好地帮助越早,张贴[SSCCE](http://sscce.org/)。 2)[嵌套布局示例](http://stackoverflow.com/a/5630271/418556)动态添加标签。这是基本相同的原则。 – 2012-03-27 08:32:54

+0

您的示例代码有点稀疏。也许你可以创建一个更完整的例子? – Paaske 2012-03-27 08:34:59

回答

3

有时您看不到某个按钮时,这是一个布局管理器问题(因为您没有为布局管理器设置正确的属性)。该按钮(JButton.setBounds()

this.jPanel2.setLayoutManager(null); 

和设置范围:您可以通过禁用它进行测试。

如果上述问题解决了您的问题,那么您需要查看您正在使用的LayoutManager设置的要求(另请参阅Robin的答案)。

所有呼叫validate(),revalidate()repaint()不需要这样做。

+2

-1甚至建议空布局管理器并手动设置边界。在这种情况下没有正当理由去做 – Robin 2012-03-27 08:34:39

+0

我建议它确认调用布局管理器时出错,而不是解决方案。 – Thirler 2012-03-27 08:49:07

+0

我添加了倒票,但当我看到您的评论时删除了它。也许需要编辑和扩展。 – 2012-03-27 09:05:01

3

通常add调用就足够了。

注意:a BorderLayout只能在每个位置包含一个组件。因此,如果您在NORTH位置添加其他组件,您的按钮将不可见。

第二个说明:默认情况下,JPanel没有BorderLayout但是FlowLayout。您是否在该特定面板上设置了BorderLayout?否则BorderLayout#NORTH约束是不正确

所有validaterevalidaterepaint呼叫可以被移除

编辑

似乎需要某种验证毕竟。我的印象是,Swing应该足够聪明,以便在某些事情被添加到Container时收听事件,并更新任何必要的内容(有点类似于更新TableModel根据事件更新JTable,而不需要拨打repaintJTable上的喜欢)。

然而,在SSCCE尝试这种时候,我来到了下面的代码(不同的版本,只发布最详尽版本)

  • 没有滚动窗格中,validate调用似乎没有任何效果。其实,我需要再次打电话pack,使新的标签可见(不包括在SSCCE,但是从代码删除滚动面板是微不足道的)
  • 与滚动窗格中,validate呼叫有效果

    import javax.swing.BoxLayout; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    import java.awt.BorderLayout; 
    import java.awt.Container; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    
    public class AddLabelsAtRuntime { 
    
        private int fLabelCounter = 0; 
        private JPanel fLabelPanel; 
        private final JFrame fTestFrame; 
    
        public AddLabelsAtRuntime() { 
        fLabelPanel = new JPanel(); 
        BoxLayout boxLayout = new BoxLayout(fLabelPanel, BoxLayout.PAGE_AXIS); 
        fLabelPanel.setLayout(boxLayout); 
        fTestFrame = new JFrame("Dynamically add labels"); 
        } 
    
        private JFrame createUI(){ 
    
        Container contentPane = fTestFrame.getContentPane(); 
        contentPane.setLayout(new BorderLayout()); 
    
        JScrollPane scrollPane = new JScrollPane(fLabelPanel); 
        scrollPane.setPreferredSize(new Dimension(200, 200)); 
        contentPane.add(scrollPane, BorderLayout.CENTER); 
    
        contentPane.add(createButtonPanel(), BorderLayout.SOUTH); 
    
        fTestFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        fTestFrame.pack(); 
        return fTestFrame; 
        } 
    
        private void addLabel(){ 
        fLabelPanel.add(new JLabel("Label " + ++fLabelCounter)); 
        } 
    
        private JPanel createButtonPanel(){ 
        JPanel buttonPanel = new JPanel(); 
        BoxLayout boxLayout = new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS); 
        buttonPanel.setLayout(boxLayout); 
    
        JButton validateButton = new JButton("Add + validate"); 
        validateButton.addActionListener(new ActionListener() { 
         @Override 
         public void actionPerformed(ActionEvent e) { 
         addLabel(); 
         fLabelPanel.validate(); 
         fTestFrame.validate(); 
         } 
        }); 
        buttonPanel.add(validateButton); 
    
        JButton noValidateButton = new JButton("Add"); 
        noValidateButton.addActionListener(new ActionListener() { 
         @Override 
         public void actionPerformed(ActionEvent e) { 
         addLabel(); 
         } 
        }); 
        buttonPanel.add(noValidateButton); 
    
        JButton packButton = new JButton("Add + pack"); 
        packButton.addActionListener(new ActionListener() { 
         @Override 
         public void actionPerformed(ActionEvent e) { 
         addLabel(); 
         fTestFrame.pack(); 
         } 
        }); 
        buttonPanel.add(packButton); 
    
        return buttonPanel; 
        } 
    
        public static void main(String[] args) { 
        EventQueue.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
         AddLabelsAtRuntime addLabelsAtRuntime = new AddLabelsAtRuntime(); 
         addLabelsAtRuntime.createUI().setVisible(true); 
         } 
        }); 
    
        } 
    
    } 
    
    的Java Swing

    与动态图像和ActionListener的创建的JButton -

+0

我通常觉得有必要调用'validate()' - 就像在上面链接的例子中添加标签一样。你能否提供一个动态添加组件的SSCCE,而不需要它? – 2012-03-27 09:07:49

+0

今晚我会试一试,但我不记得需要它 – Robin 2012-03-27 09:58:50

+0

期待看到的代码。 +1评论'BorderLayout.NORTH' – 2012-03-27 10:07:18

0

用图像和ActionListener的创建动态的JButton。您将可以在一个位置更改按钮高度,宽度水平间距和垂直间距。

you can find more details from here

enter image description here