单击按钮后将对象添加到 JPanel
Add Object to JPanel after button click
我创建了一个 JScrollPane,里面有一个 JPanel,我想在按下按钮后添加 JPanel/JLabel/Other 个对象。例如,在按下三个按钮后,我想得到这样的东西:
我尝试了 myJPane.add(testLabel)
和 testlabel.setBounds()
但没有结果,我不想使用 GridLayout,因为尺寸无法更改。如果添加的对象具有不同的大小,我会喜欢它——根据文本内容进行调整。
我应该使用什么以及如何使用它?
提前致谢。
最好的祝福,
汤姆.
我将使用 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。
这是 JScrollPane
中的 JPanel
,按下按钮时会向其中添加 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
会将标签堆叠在一起。
备注:
必须在 label
上调用 setOpaque(true)
才能使用背景颜色。
Box.createRigidArea
用于创建间隙。想怎么用就怎么用。
- 必须调用
revalidate()
才能立即显示新组件。
- 调用
pack()
(在 JFrame
上)每次都会调整它的大小以适应所有新组件。我只是把它放在那里进行演示,因为初始框架尺寸太小,无法显示添加的初始组件。
我创建了一个 JScrollPane,里面有一个 JPanel,我想在按下按钮后添加 JPanel/JLabel/Other 个对象。例如,在按下三个按钮后,我想得到这样的东西:
我尝试了 myJPane.add(testLabel)
和 testlabel.setBounds()
但没有结果,我不想使用 GridLayout,因为尺寸无法更改。如果添加的对象具有不同的大小,我会喜欢它——根据文本内容进行调整。
我应该使用什么以及如何使用它?
提前致谢。 最好的祝福, 汤姆.
我将使用 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。
这是 JScrollPane
中的 JPanel
,按下按钮时会向其中添加 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)
才能使用背景颜色。Box.createRigidArea
用于创建间隙。想怎么用就怎么用。- 必须调用
revalidate()
才能立即显示新组件。 - 调用
pack()
(在JFrame
上)每次都会调整它的大小以适应所有新组件。我只是把它放在那里进行演示,因为初始框架尺寸太小,无法显示添加的初始组件。
label
上调用