2015-05-15 86 views
1

我已经创建了一个JpanelPane,里面有一个JPanel,我想在按下按钮后添加JPanel/JLabel /其他对象。例如经过三次按下按钮我想是这样的: desired result点击按钮后将对象添加到JPanel

我试图用myJPane.add(testLabel)testlabel.setBounds()没有结果,我不希望使用的,因为不变的尺寸的网格布局。如果添加的对象具有不同的大小,我希望它可以调整为文本内容。

我该如何使用它以及如何使用?

在此先感谢。 最好的问候, 汤姆。

+0

你有没有试过? – ELITE

+0

'JScrollPane'取决于组件的首选大小,因此使用'null'布局不可避免地会导致灾难(像往常一样)。您可以使用另一个布局管理器,例如垂直的“BoxLayout”。在运行时添加组件后,您应该'重新验证()'和'重新绘制()'容器。另外考虑使用'JList'。 – kiheru

+0

*“..要按下按钮后添加JPanel/JLabel /其他对象..”*如果任何一种情况需要添加一堆相同的组件,请考虑使用'JList'(使用自定义单元格渲染器)代替。 –

回答

1

这里是一个JScrollPane在按下按钮时添加JLabel s到它内部的JPanel

public class Example extends JFrame { 

    public Example() { 

     JPanel boxPanel = new JPanel(); 
     boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.PAGE_AXIS)); 

     JTextField textField = new JTextField(20);  
     JButton sendButton = new JButton("Send"); 
     sendButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       JLabel label = new JLabel(textField.getText()); 
       label.setOpaque(true); 
       label.setBackground(Color.RED); 
       boxPanel.add(label); 
       boxPanel.add(Box.createRigidArea(new Dimension(0,5))); 
       textField.setText(""); 
       boxPanel.revalidate(); 
//    pack(); 
      } 
     }); 


     JPanel southPanel = new JPanel(); 
     southPanel.add(textField); 
     southPanel.add(sendButton); 

     add(new JScrollPane(boxPanel)); 
     add(southPanel, BorderLayout.PAGE_END); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new Example(); 
    } 
} 

BoxLayout将堆叠在彼此的顶部上的标签。

注:

  • setOpaque(true)必须label来要求它履行的背景色。
  • Box.createRigidArea用于创建空白。如你所愿使用它。
  • 为了立即显示新组件,致电revalidate()势在必行。
  • 调用pack()(在JFrame上)会每次调整大小以适应所有新组件。我只是把它放在那里进行演示,因为初始帧大小太小而无法显示添加的初始组件。
+0

我爱上了你。 –

0

我将使用一个BoxLayout,创建一个垂直框,并且在每个按钮操作之后,它将为此框添加一个新的JPanel。

例子:

public class YourChat extends JPanel{ 
    private JScrollPane sc; 
    private Box bv; 

    public YourChat(){ 
     bv = Box.createVerticalBox(); 
     sc = new JScrollPane(bv); 
     //your functions (panel creation, addition of listeners, etc) 

     add(sc); 
    } 

    //panel customized to have red backgroud 
    private class MyPanel extends JPanel(){ 
     private JLabel label=new JLabel(); 
     public MyPanel(String text){ 
      setBackgroundColor(Color.red); 
      add(label); 
     } 
    } 


    //inside the action listener 
    public void actionPerformed(ActionEvent e) { 
      sc.add(new MyPanel(textField.getText())); 
      textField.setText(""); 
    } 
} 

有关的额外信息检查: [https://docs.oracle.com/javase/tutorial/uiswing/layout/box.html]

又见例如 [http://www.java2s.com/Code/Java/Swing-JFC/VerticalandhorizontalBoxLayouts.htm]

0

使用BoxLayout的,如果你只想要添加垂直,否则,你可以使用FlowLayout适用于两个方向。

相关问题