2015-05-15 109 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適用於兩個方向。

相關問題