Java 单击按钮后将对象添加到JPanel
我已经创建了一个JScrollPane,其中包含一个JPanel,我想在按下按钮后添加JPanel/JLabel/其他对象。例如,按下三次按钮后,我想得到如下结果: 我用Java 单击按钮后将对象添加到JPanel,java,swing,jpanel,add,jscrollpane,Java,Swing,Jpanel,Add,Jscrollpane,我已经创建了一个JScrollPane,其中包含一个JPanel,我想在按下按钮后添加JPanel/JLabel/其他对象。例如,按下三次按钮后,我想得到如下结果: 我用testLabel.setBounds()尝试了myJPane.add(testLabel),但没有结果,我不想使用GridLayout,因为它的大小是不可更改的。我想它,如果添加的对象有不同的大小-调整到文本内容 我应该用什么,怎么用 提前谢谢。 顺致敬意, Tom。我将使用BoxLayout,创建一个垂直框,在每个按钮操作
testLabel.setBounds()
尝试了myJPane.add(testLabel)
,但没有结果,我不想使用GridLayout,因为它的大小是不可更改的。我想它,如果添加的对象有不同的大小-调整到文本内容
我应该用什么,怎么用
提前谢谢。
顺致敬意,
Tom。我将使用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("");
}
}
有关更多信息,请查看:
[
另请参见示例
[如果您只想垂直添加,请使用BoxLayout,否则您可以在两个方向上使用FlowLayout。在
JScrollPane
中有一个JPanel
,当按下按钮时,它会添加JLabel
s:
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
JScrollPane
取决于组件的首选大小,因此使用null
布局不可避免地会导致灾难(像往常一样)。你可以使用另一个布局管理器,如垂直BoxLayout
。在运行时添加组件后,你应该revalidate()
和repaint())“容器”。也可以考虑使用<代码> jList。“……在按下按钮后要添加JPANT/JLAP/其他对象。”如果有一种情况需要添加一组相同的组件,请考虑使用<代码> jList(用自定义单元渲染器)代替。我爱上了你。