如何在 swing 中通过中间面板使视图居中
How to center the view by middle panel in swing
我必须构建一个包含三个面板的 UI
,leftPanel
、middlePanel
和 rightPanel
,面板应对齐 Horizontally
left
和 right
面板应尽可能获得 maximum
和 equal
宽度,而中间面板可获得 minimum
宽度作为其子面板需要组件,添加面板后,视图应以中间面板为中心。
我已经完成了以下测试代码来构建 UI
import java.awt.Color;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class SwingTest extends JFrame {
private static final long serialVersionUID = 1L;
public SwingTest() {
setTitle("Swing Test");
setSize(750, 350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(getParent());
// Rule used to find the component positions, for the testing purpose
Rule rule = new Rule(Rule.HORIZONTAL, true);
rule.setPreferredWidth(10);
rule.setPreferredHeight(40);
SidePanel leftPanel = new SidePanel("Left");
SidePanel rightPanel = new SidePanel("Right");
JPanel middlePanel = new JPanel();
middlePanel.setBorder(BorderFactory.createLineBorder(Color.black));
// Add left,right and middle panel horizontally
JPanel containerPanel = new JPanel();
containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.X_AXIS));
containerPanel.add(leftPanel);
containerPanel.add(middlePanel);
containerPanel.add(rightPanel);
// Add rule and container panel Vertically
JPanel outerPanel = new JPanel();
outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
outerPanel.add(rule);
outerPanel.add(containerPanel);
add(outerPanel);
}
public static void main(String[] args) {
SwingTest test = new SwingTest();
test.setVisible(true);
}
private static class SidePanel extends JPanel {
private static final long serialVersionUID = 1L;
private SidePanel(String text) {
setLayout(new GridBagLayout());
add(new JLabel(text));
}
}
}
我用过Rule
class 来自oracle swing tutorial site,它可以用来找到组件的位置。得到 Rule.java
我遇到的问题如 UI 屏幕截图所示,视图未以中间面板居中,现在视图居中为“左 + 中间面板 = 右面板”的宽度
我不想手动设置面板的高度和宽度,应该由 LayoutManager
自己处理。
我想要的是中间面板必须以 left + middle/2 = middle/2 + right
面板宽度的方式居中。
我找不到使中间面板居中查看的方法,有人可以帮我找到解决方案吗?
您需要了解 BoxLayout 的工作原理。
首先space分配在每个组件的首选大小。那么如果有多余的space,那space就分配给每个分量
中间似乎没有居中,因为右侧标签的首选尺寸大于左侧标签。所以当分配额外的 space 时,右侧比左侧大。
这很容易测试。只需将右侧面板的文本更改为 "LEFT".
然而,这又引出了另一个问题——为什么中间面板的尺寸没有变化?我不知道这个问题的答案。尽管出于某种原因,默认的 FlowLayout 似乎与 GridBagLayout 的工作方式不同。同样,您可以通过将中间面板的布局更改为 GridBagLayout 来对此进行测试。
如果您始终希望 left/right 面板大小相同,那么您可能需要考虑使用 Relative Layout。使用此布局,基本代码为:
RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
JPanel panel = new JPanel( rl );
panel.add(leftPanel, new Float(1));
panel.add(middle, new Float(3));
panel.add(rightPanel, new Float(1));
现在 left/right 面板将具有相同的大小,与添加到每个面板的组件无关。
我必须构建一个包含三个面板的 UI
,leftPanel
、middlePanel
和 rightPanel
,面板应对齐 Horizontally
left
和 right
面板应尽可能获得 maximum
和 equal
宽度,而中间面板可获得 minimum
宽度作为其子面板需要组件,添加面板后,视图应以中间面板为中心。
我已经完成了以下测试代码来构建 UI
import java.awt.Color;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class SwingTest extends JFrame {
private static final long serialVersionUID = 1L;
public SwingTest() {
setTitle("Swing Test");
setSize(750, 350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(getParent());
// Rule used to find the component positions, for the testing purpose
Rule rule = new Rule(Rule.HORIZONTAL, true);
rule.setPreferredWidth(10);
rule.setPreferredHeight(40);
SidePanel leftPanel = new SidePanel("Left");
SidePanel rightPanel = new SidePanel("Right");
JPanel middlePanel = new JPanel();
middlePanel.setBorder(BorderFactory.createLineBorder(Color.black));
// Add left,right and middle panel horizontally
JPanel containerPanel = new JPanel();
containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.X_AXIS));
containerPanel.add(leftPanel);
containerPanel.add(middlePanel);
containerPanel.add(rightPanel);
// Add rule and container panel Vertically
JPanel outerPanel = new JPanel();
outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
outerPanel.add(rule);
outerPanel.add(containerPanel);
add(outerPanel);
}
public static void main(String[] args) {
SwingTest test = new SwingTest();
test.setVisible(true);
}
private static class SidePanel extends JPanel {
private static final long serialVersionUID = 1L;
private SidePanel(String text) {
setLayout(new GridBagLayout());
add(new JLabel(text));
}
}
}
我用过Rule
class 来自oracle swing tutorial site,它可以用来找到组件的位置。得到 Rule.java
我遇到的问题如 UI 屏幕截图所示,视图未以中间面板居中,现在视图居中为“左 + 中间面板 = 右面板”的宽度
我不想手动设置面板的高度和宽度,应该由 LayoutManager
自己处理。
我想要的是中间面板必须以 left + middle/2 = middle/2 + right
面板宽度的方式居中。
我找不到使中间面板居中查看的方法,有人可以帮我找到解决方案吗?
您需要了解 BoxLayout 的工作原理。
首先space分配在每个组件的首选大小。那么如果有多余的space,那space就分配给每个分量
中间似乎没有居中,因为右侧标签的首选尺寸大于左侧标签。所以当分配额外的 space 时,右侧比左侧大。
这很容易测试。只需将右侧面板的文本更改为 "LEFT".
然而,这又引出了另一个问题——为什么中间面板的尺寸没有变化?我不知道这个问题的答案。尽管出于某种原因,默认的 FlowLayout 似乎与 GridBagLayout 的工作方式不同。同样,您可以通过将中间面板的布局更改为 GridBagLayout 来对此进行测试。
如果您始终希望 left/right 面板大小相同,那么您可能需要考虑使用 Relative Layout。使用此布局,基本代码为:
RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
JPanel panel = new JPanel( rl );
panel.add(leftPanel, new Float(1));
panel.add(middle, new Float(3));
panel.add(rightPanel, new Float(1));
现在 left/right 面板将具有相同的大小,与添加到每个面板的组件无关。