我已經創建了一個JpanelPane,裏面有一個JPanel,我想在按下按鈕後添加JPanel/JLabel /其他對象。例如經過三次按下按鈕我想是這樣的: 點擊按鈕後將對象添加到JPanel
我試圖用myJPane.add(testLabel)
但testlabel.setBounds()
沒有結果,我不希望使用的,因爲不變的尺寸的網格佈局。如果添加的對象具有不同的大小,我希望它可以調整爲文本內容。
我該如何使用它以及如何使用?
在此先感謝。 最好的問候, 湯姆。
我已經創建了一個JpanelPane,裏面有一個JPanel,我想在按下按鈕後添加JPanel/JLabel /其他對象。例如經過三次按下按鈕我想是這樣的: 點擊按鈕後將對象添加到JPanel
我試圖用myJPane.add(testLabel)
但testlabel.setBounds()
沒有結果,我不希望使用的,因爲不變的尺寸的網格佈局。如果添加的對象具有不同的大小,我希望它可以調整爲文本內容。
我該如何使用它以及如何使用?
在此先感謝。 最好的問候, 湯姆。
這裏是一個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
上)會每次調整大小以適應所有新組件。我只是把它放在那裏進行演示,因爲初始幀大小太小而無法顯示添加的初始組件。我愛上了你。 –
我將使用一個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]
使用BoxLayout的,如果你只想要添加垂直,否則,你可以使用FlowLayout適用於兩個方向。
你有沒有試過? – ELITE
'JScrollPane'取決於組件的首選大小,因此使用'null'佈局不可避免地會導致災難(像往常一樣)。您可以使用另一個佈局管理器,例如垂直的「BoxLayout」。在運行時添加組件後,您應該'重新驗證()'和'重新繪製()'容器。另外考慮使用'JList'。 – kiheru
*「..要按下按鈕後添加JPanel/JLabel /其他對象..」*如果任何一種情況需要添加一堆相同的組件,請考慮使用'JList'(使用自定義單元格渲染器)代替。 –