Java 将JPanel垂直地一个接一个地添加到JFrame,每个都会水平地接触到边框
我想将JPanel一个接一个地垂直添加到JFrame。每个面板应覆盖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
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我想把它用于聊天应用程序。我的问题是,我不能这样做,怎么做。你可以这样做,或者把我的名誉还给我。