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

时间:2015-05-15 11:06:15

标签: java swing jpanel add jscrollpane

我已经创建了一个带有JPanel的JScrollPane,我想在按下按钮后添加JPanel / JLabel / Other对象。例如,按下三个按钮后,我想得到这样的东西:  desired result

我使用myJPane.add(testLabel)尝试testlabel.setBounds()但没有结果,因为尺寸不可更改,我不想使用GridLayout。如果添加的对象具有不同的大小,我希望它 - 根据文本内容进行调整。

我应该使用它以及如何使用?

提前致谢。 最好的祝福, 汤姆。

3 个答案:

答案 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用于两个方向。