组件的定位(如何放置几个相同尺寸的按钮中心屏幕)

将组件准确放置在JFrame所需位置的可靠推荐方法?

在我的例子中,我有一个简单的Jframe充当菜单。 框架由顶部的标签和中间的三个按钮组成。 使用自由设计,3个按钮似乎漂浮在框架上,当我运行项目时,它们会转变为难看的位置。 只有当3个按钮被拖动到最大长度(到框架的每一侧)时,它们才会表现为“锁定到位”。 这非常难看。我希望3个按钮位于框架中间的中心位置。

我正在使用Netbeans。 自由设计是我一直在使用的,但只有当有很多组件才能将它们“插入”到其他位置时才会很好。 使用其他设置布局管理器无效。 有经验的人如何处理这样的问题?

我对彻底的学习很感兴趣。 如果这个问题很痛苦,业余人士至少可以推荐一本教科书或其他GUI学习资源吗? (我已经两次使用“首先使用java的对象”,并且只有非常基本的GUI构建解释)。

感谢任何方向。

事情很简单,但当然,你应该自己搜索一下。

顺便说一下,管理布局和按钮大小是一个问题。

忘了请使用任何布局创建者,因为它们会产生混淆代码,并且理解真正发生的事情并不好。

通常对于初学者我谈论一个特定的布局,即BoxLayout [编辑:当然有很多更简单的方法来达到目标​​,这个答案有一个教学目的,并希望大到足以被理解,而不仅仅是一个“在这里,做这个复制粘贴]

首先,我们需要了解Box布局的工作原理。 它有两种AXIS(即将添加组件的方式),从上到下(PAGE_AXIS)和从左到右(LINE_AXIS)。 使用这两个轴并嵌套各种布局,你可以很好地完成任何你想要的。

首先要知道的是如何嵌套更多布局。

为了嵌套布局,我们将使用JPanel,每个都有一个不同的轴,将被一个放在另一个内。

开始分析您的案例。 面板中央有三个标签。 我们可以从内部面板开始,一个带有组件; 我们需要一个PAGE_AXIS(顶部到底部),其中包括:

// +---------------------+ // | white space | // | | // + - - - - - - - - - - + // |JLABEL JLABEL JLABEL| // + - - - - - - - - - - + // | white space | // |_____________________| // | button | // |---------------------| // |_____________________| // | button | // |---------------------| // |_____________________| // | button | // |---------------------| // | white space | // +---------------------+ 

正如您所看到的那样,Panel适合于组件的宽度,诀窍是BoxLayout更喜欢为组件提供最大尺寸。 在这种情况下没有边距,所以我们需要一个外部不同的JPanel,使用LINE_AXIS,以便放置左右边距,结果将是:

 // +---+---------------------+---+ // | | white space | | // | | | | // | + - - - - - - - - - - + | // | W |JLABEL JLABEL JLABEL| W | // | H + - - - - - - - - - - + H | // | I | white space | I | // | T _____________________ T | // | E | button | E | // | --------------------- | // | S _____________________ S | // | P | button | P | // | A --------------------- A | // | C _____________________ C | // | E | button | E | // | --------------------- | // | | white space | | // +-----------------------------+ 

因此,我们需要知道的第一件事就是设置每个面板的布局。

 // Initializing JPanel outside = new JPanel(); JPanel inside = new JPanel(); // setting a layout with horizontal alignment outside.setLayout(new BoxLayout(outside, BoxLayout.LINE_AXIS)); // setting a layout with vertical alignment inside.setLayout(new BoxLayout(inside, BoxLayout.PAGE_AXIS)); 

完成后,我们必须填写面板。 从外面开始。 局外人需要(看我的图像)首先是水平空间,然后是内侧面板,然后是另一个水平空间。 我继续添加它们。

 // create an horizontal space of 20px outside.add(Box.createHorizontalStrut(20)); outside.add(inside); outside.add(Box.createHorizontalStrut(20)); 

现在我们移动到里面,我们需要一个大的白色空间,标签,另一个白色,一个按钮,一个小白色,按钮,小白色,第三个按钮和一个大的白色。 我继续填写内部小组。

 // create a vertical space of 20px inside.add(Box.createVerticalStrut(20)); JLabel title = new JLabel("THE TITLE"); inside.add(title); inside.add(Box.createVerticalStrut(20); JButton btt1 = new JButton("BUTTON ONE"); // create a new dimension object Dimension d = new Dimension(200,40); // set the four kind of size, the button CANNOT be different than the dimension I choose btt1.setSize(d); btt1.setMinimumSize(d); btt1.setMaximumSize(d); btt1.setPreferredSize(d); JButton btt2 = new JButton("BUTTON TWO"); btt2.setSize(d); btt2.setMinimumSize(d); btt2.setMaximumSize(d); btt2.setPreferredSize(d); JButton btt3 = new JButton("BUTTON THREE"); btt3.setSize(d); btt3.setMinimumSize(d); btt3.setMaximumSize(d); btt3.setPreferredSize(d); // Now that the button are ready we put them in the panel. inside.add(btt1); inside.add(Box.createVerticalStrut(5)); inside.add(btt2); inside.add(box.createVerticalStrut(5)); inside.add(btt3); // Last white space, the bottom margin: inside.add(Box.createVerticalStrut(20)); 

现在我的结构设置得很完美。 只需将其显示即可完成所有操作。 当然你需要将它放在JFrame或JDialog中,当然第一个面板可以是JFrame或JDialog,因为可以为任何Component设置BoxLayout。

有了这个基础教程,我希望你能理解编程这种结构的基础知识。 但是你需要阅读这篇文章才能继续下去并使事情变得更复杂: http : //docs.oracle.com/javase/tutorial/uiswing/layout/index.html http://docs.oracle.com/javase /tutorial/uiswing/layout/box.html

祝你今天愉快。

布局非常强大,节省时间……来自其他语言,如Delphi和VB,我可以告诉你Swing的最佳function之一是布局管理器。

在此处输入图像描述

 public class TestLayout06 { public static void main(String[] args) { new TestLayout06(); } public TestLayout06() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new MenuPanel()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class MenuPanel extends JPanel { public MenuPanel() { JLabel label = new JLabel("Menu"); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; add(label, gbc); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridy++; add(new JButton("Option 1"), gbc); gbc.gridy++; add(new JButton("Option 2"), gbc); gbc.gridy++; add(new JButton("Option 3"), gbc); } } } 

看一眼

  • 使用布局管理器
  • 布局管理器的可视指南