Java 单击按钮后将对象添加到JPanel

Java 单击按钮后将对象添加到JPanel,java,swing,jpanel,add,jscrollpane,Java,Swing,Jpanel,Add,Jscrollpane,我已经创建了一个JScrollPane,其中包含一个JPanel,我想在按下按钮后添加JPanel/JLabel/其他对象。例如,按下三次按钮后,我想得到如下结果: 我用testLabel.setBounds()尝试了myJPane.add(testLabel),但没有结果,我不想使用GridLayout,因为它的大小是不可更改的。我想它,如果添加的对象有不同的大小-调整到文本内容 我应该用什么,怎么用 提前谢谢。 顺致敬意, Tom。我将使用BoxLayout,创建一个垂直框,在每个按钮操作

我已经创建了一个JScrollPane,其中包含一个JPanel,我想在按下按钮后添加JPanel/JLabel/其他对象。例如,按下三次按钮后,我想得到如下结果:

我用
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(用自定义单元渲染器)代替。我爱上了你。