我已经创建了一个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'(使用自定义单元格渲染器)代替。 –