Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JPanel垂直地一个接一个地添加到JFrame,每个都会水平地接触到边框_Java_Swing_Layout_Jframe - Fatal编程技术网

Java 将JPanel垂直地一个接一个地添加到JFrame,每个都会水平地接触到边框

Java 将JPanel垂直地一个接一个地添加到JFrame,每个都会水平地接触到边框,java,swing,layout,jframe,Java,Swing,Layout,Jframe,我想将JPanel一个接一个地垂直添加到JFrame。每个面板应覆盖jframe的整个宽度。即使重新调整框架尺寸,这些面板也应覆盖整个宽度。我想让它使用任何布局。不应该使用线程。从包含的图片中抓住我想要的要点。 提前谢谢。任何帮助的尝试都将不胜感激 这是您请求的代码,我投了反对票…… public class AttachToWalls extends JFrame implements ActionListener { JLabel m1; JLabel m2; JP

我想将JPanel一个接一个地垂直添加到JFrame。每个面板应覆盖jframe的整个宽度。即使重新调整框架尺寸,这些面板也应覆盖整个宽度。我想让它使用任何布局。不应该使用线程。从包含的图片中抓住我想要的要点。 提前谢谢。任何帮助的尝试都将不胜感激

这是您请求的代码,我投了反对票……

public class AttachToWalls extends JFrame implements ActionListener {

    JLabel m1;
    JLabel m2;
    JPanel pane;
    JPanel bottom = new JPanel();
    JScrollPane jsp;
    JButton sender = new JButton("Sender");
    JButton receiver = new JButton("Receiver");

    AttachToWalls() {
        setLayout(new FlowLayout());
        jsp = new JScrollPane(pane);
        add(jsp, BorderLayout.CENTER);
        sender.addActionListener(this);
        receiver.addActionListener(this);
        bottom.add(sender);
        bottom.add(receiver);
        add(bottom);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == sender) {
            m1 = new JLabel("Message from Sender...");
            remove(sender);
            remove(receiver);
            Component comp = Box.createHorizontalStrut(this.getWidth() - m1.getWidth());
            comp.setBackground(Color.red);
            JPanel pane1 = new JPanel();
            pane1.setBackground(Color.gray);
            pane1.add(m1);
            pane1.add(comp);
            add(pane1);
            this.validate();
        } else if (e.getSource() == receiver) {
            m2 = new JLabel("Messsage from Receiver...");
            Component comp = Box.createHorizontalStrut((int) this.getWidth() - m2.getWidth());
            comp.setBackground(Color.red);
            JPanel pane2 = new JPanel();
            pane2.setBackground(Color.gray);
            pane2.add(m2);
            pane2.add(comp);
            add(pane2);
            this.validate();
        }
    }

    public static void main(String[] args) {
        new AttachToWalls();
    }
}

您可以使用
GridBagLayout
。它支持“填充”约束,允许您在网格中填充构件。有关可以使用的约束的更多信息,请阅读上Swing教程的部分


或者,如果你想走出盒子,你可以使用。它可以像BoxLayout一样工作。它可以在首选高度垂直显示组件,但有一个参数可以自动填充宽度。它不是JDK的一部分,但您不必担心构建约束。

您可以使用
GridBagLayout
。它支持“填充”约束,允许您在网格中填充构件。有关可以使用的约束的更多信息,请阅读上Swing教程的部分


或者,如果你想走出盒子,你可以使用。它可以像BoxLayout一样工作。它可以在首选高度垂直显示组件,但有一个参数可以自动填充宽度。它不是JDK的一部分,但您不必担心构建约束。

首先,您不能多次显示标签或任何组件的实例

不要像这样在动作侦听器中不断添加标签:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
重新实例化它,如下所示:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
您的最佳布局如前所述

您应该这样设置GridBagLayout(填充水平面):

然后声明一个整数字段y和约束对象,如下所示:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
然后每次在actionPerformed(..)方法中添加面板时,都迭代y

        gbc.gridy = y++;
        add(pane1, gbc);

首先,对于该问题,不能多次显示标签或任何组件的实例

不要像这样在动作侦听器中不断添加标签:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
重新实例化它,如下所示:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
您的最佳布局如前所述

您应该这样设置GridBagLayout(填充水平面):

然后声明一个整数字段y和约束对象,如下所示:

    pane1.setBackground(Color.gray); 
    pane1.add(m1);
    pane1.setBackground(Color.gray);
    m1 = new JLabel("Message from Sender...");
    pane1.add(m1);
private int y = 0;
private GridBagConstraints gbc = new GridBagConstraints();
然后每次在actionPerformed(..)方法中添加面板时,都迭代y

        gbc.gridy = y++;
        add(pane1, gbc);

经过我的努力,我已经解决了您的问题,希望您能接受我的解决方案:)


经过我的努力,我已经解决了您的问题,希望您能接受我的解决方案:)


你自己试过吗?您有可以共享的可运行代码示例吗?@AndrewThompson来看看我尝试过的代码。@Gorb Brother看看我的代码。我不知道您为什么要将此实现为
ActionListener
。你用这个干什么?您(我认为)同时使用了
BorderLayout
和向容器添加基于
Box
的struts?我不确定这是否行得通。@Gorb我想把它用于聊天应用程序。我的问题是,我不能这样做,怎么做。你可以这样做,或者把我的名誉还给我。你自己试过这么做吗?您有可以共享的可运行代码示例吗?@AndrewThompson来看看我尝试过的代码。@Gorb Brother看看我的代码。我不知道您为什么要将此实现为
ActionListener
。你用这个干什么?您(我认为)同时使用了
BorderLayout
和向容器添加基于
Box
的struts?我不确定这是否行得通。@Gorb我想把它用于聊天应用程序。我的问题是,我不能这样做,怎么做。你可以这样做,或者把我的名誉还给我。