【问题标题】:Add Object to JPanel after button click单击按钮后将对象添加到 JPanel
【发布时间】:2015-05-15 11:06:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你试过了吗??
  • JScrollPane 取决于组件的首选大小,因此使用null 布局不可避免地会导致灾难(像往常一样)。您可以使用另一个布局管理器,例如垂直BoxLayout。在运行时添加组件后,您应该revalidate()repaint() 容器。也可以考虑改用JList
  • "..想要在按下按钮后添加 JPanel/JLabel/Other 对象.." 如果任何一种情况需要添加一堆相同的组件,请考虑改用JList(带有自定义单元格渲染器)。

标签: java swing jpanel add jscrollpane


【解决方案1】:

这是JScrollPane 内的JPanel,按下按钮时会向其中添加JLabels:

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 上)每次都会调整它的大小以适应所有新组件。我只是将它放在那里进行演示,因为初始帧大小太小而无法显示添加的初始组件。

【讨论】:

  • 我爱上了你。
【解决方案2】:

我将使用一个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]

【讨论】:

    【解决方案3】:

    如果您只想垂直添加,请使用 BoxLayout,否则您可以在两个方向上使用 FlowLayout。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多