java-为什么这三个使用GridBagLayout的面板使用不同的额外空间,以及如何使它们统一
作者:互联网
我有一个包含多个面板的应用程序;我想自由地为不同的面板使用不同的布局管理器,但是希望它们在用户调整窗口大小时具有类似的行为.
package example;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
public class TP1 extends JFrame
{
public static void main(String[] args)
{
TP1 tp1 = new TP1();
tp1.go();
}
public void go()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
// create a panel with some labels on it
JPanel innerFirst = new JPanel();
innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS));
innerFirst.add(new JLabel("one"));
innerFirst.add(new JLabel("two"));
innerFirst.add(new JLabel("three"));
innerFirst.add(new JLabel("four"));
// put that panel in a scroll pane
JScrollPane firstSP = new JScrollPane(innerFirst);
// make another panel and put our scrolled panel in it
JPanel outerFirst = new JPanel();
outerFirst.setLayout(new BoxLayout(outerFirst, BoxLayout.PAGE_AXIS));
outerFirst.add(firstSP);
// create a GridBagLayout panel with some text fields on it
JPanel innerSecond = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = .25;
gbc.anchor = GridBagConstraints.LINE_START;
innerSecond.add(new JTextField(8), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
innerSecond.add(new JTextField(10), gbc);
gbc.gridx =0;
gbc.gridy = 2;
innerSecond.add(new JTextField(12), gbc);
// put that panel in a scroll pane
JScrollPane secondSP = new JScrollPane(innerSecond);
// make another panel and put our second scrolled panel in it
JPanel outerSecond = new JPanel();
outerSecond.setLayout(new BoxLayout(outerSecond, BoxLayout.LINE_AXIS));
outerSecond.add(secondSP);
JPanel innerThird = new JPanel(new GridBagLayout());
GridBagConstraints gbc3 = new GridBagConstraints();
gbc3.anchor = GridBagConstraints.LINE_END;
gbc.weightx = .25;
gbc3.gridx = 0;
gbc3.gridy = 0;
innerThird.add(new JLabel("1st label"), gbc3);
gbc3.gridy = 1;
innerThird.add(new JLabel("second label"), gbc3);
gbc3.gridy = 2;
innerThird.add(new JLabel("IIIrd label"), gbc3);
gbc3.anchor = GridBagConstraints.LINE_START;
gbc3.gridx = 1;
gbc3.gridy = 0;
innerThird.add(new JTextField(8), gbc3);
gbc3.gridy = 1;
innerThird.add(new JTextField(12), gbc3);
gbc3.gridy = 2;
innerThird.add(new JTextField(14), gbc3);
JScrollPane thirdSP = new JScrollPane(innerThird);
JPanel outerThird = new JPanel();
outerThird.setLayout(new BoxLayout(outerThird, BoxLayout.LINE_AXIS));
outerThird.add(thirdSP);
// put the scrolled panes onto a tabbed pane
JTabbedPane tp = new JTabbedPane();
tp.add("text fields", outerSecond);
tp.add("labels", outerFirst);
tp.add("mixed", outerThird);
// add the tabbed pane to the frame
this.add(tp);
// pack it and ship it.
pack();
setVisible(true);
}
}
运行上面的代码,我们得到一个带有三个选项卡的带有选项卡式窗格的窗口.如果我们将窗口缩小,所有的对象都会按预期获得滚动条.如果将其放大,则三个选项的行为会有所不同:带有标签的选项卡仅将其留在窗口的左上方,带有字段的选项卡仅将其垂直居中在左边缘,而带有标签的选项卡则将其混合在一起在放大的窗口中将它们水平和垂直居中.
这对于应用程序是不可接受的;我需要以某种方式使所有面板的行为类似.我需要它们全部具有滚动条,并且如果窗口的尺寸大于内部面板的尺寸,我希望它们都保持在左上方.
另一个要求:我的选项卡被扩展JPanel的东西占据,在将JScrollPane直接放入选项卡之前,有人告诉我,但是对于我的应用程序,我也不想这样做.这只会使其他事情变得比他们需要的复杂.
除了希望在底部和右侧放置所有额外的空间之外,我非常想了解为什么这三种情况的行为会有所不同.我仍然相信,如果我们了解我们正在做的事情背后的原则,而不是仅仅左右复制示例,然后反复尝试,直到它们起作用,我们所有人都会变得更好.
(顺便说一句,我有一个GroupLayout面板,它似乎确实偏向左上方,但我认为这不是我的问题所必需的,因为它是100行代码.)
解决方法:
为了理解为什么这在您的代码中发生,您似乎需要了解某些术语.例如,PAGE_AXIS,LINE_AXIS,LINE_END,LINE_START等.由于您将它们作为约束提供,因此这些都是描述要添加到容器中的组件的方向及其起点的内容,就像您编写时一样:
innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS));
在这里,您告诉BoxLayout从指向页面开始的位置开始添加组件. (启动记事本时,光标将放置在新文档的PAGE_AXIS上).但是,当您编写此代码时:
JPanel innerSecond = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = .25;
gbc.anchor = GridBagConstraints.LINE_START;
当组件小于其显示区域时,此处使用术语锚.它确定在显示区域中放置组件的位置.但是在这里,因为您提到它的值是LINE_START,这意味着:
Place the component centered along the edge of its display area where lines of text
would normally begin for the current ComponentOrientation. Equal to WEST for horizontal,
left-to-right orientations and EAST for horizontal, right-to-left orientations.
这就是您创建的三个JTextField的原因,您会在左侧的中心看到它们.
标签:jtabbedpane,gridbaglayout,swing,layout-manager,java 来源: https://codeday.me/bug/20191101/1985668.html