我已经创建了一个带有JPanel的JScrollPane,我想在按下按钮后添加JPanel / JLabel / Other对象。例如,按下三个按钮后,我想得到这样的东西:
我使用myJPane.add(testLabel)
尝试testlabel.setBounds()
但没有结果,因为尺寸不可更改,我不想使用GridLayout。如果添加的对象具有不同的大小,我希望它 - 根据文本内容进行调整。
我应该使用它以及如何使用?
提前致谢。 最好的祝福, 汤姆。
答案 0 :(得分:1)
JPanel
里面有一个JScrollPane
,按下按钮时会向JLabel
添加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
(在Private Sub CommandButton1_Click()
Application.EnableEvents = False
TextBox1.Text = "new text"
Application.EnableEvents = True
End Sub
上)会每次调整大小以适应所有新组件。我只是把它放在那里进行演示,因为初始帧尺寸太小而无法显示添加的初始组件。答案 1 :(得分: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]
答案 2 :(得分:0)
如果您只想垂直添加,请使用BoxLayout,否则您可以将FlowLayout用于两个方向。