Java:使用 BoxLayout 在 JPanel 中垂直移动 JButton
Java: Moving JButtons vertically in a JPanel with BoxLayout
在我的程序中,我需要三个按钮。我在 JPanel
中使用了 BoxLayout
,我已经设法将它们移动到屏幕的死点。它们尺寸正确,水平位置正确,但我想将它们移到框架的顶部。我应该用什么来做到这一点?
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
public class Library extends JFrame {
private JFrame jf1;
private JPanel jp1;
private JButton jb1;
private JButton jb2;
private JButton jb3;
public Library() {
jf1 = new JFrame("Library");
jf1.setVisible(true);
jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf1.setSize(1080, 900);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
jf1.setLocation(dim.width/2-jf1.getSize().width/2, dim.height/2-jf1.getSize().height/2);
jp1 = (JPanel) jf1.getContentPane();
jp1.setLayout(new BoxLayout(jp1, BoxLayout.LINE_AXIS));
jb1 = new JButton("Genre");
jb1.setMinimumSize(new Dimension(140, 60));
jb1.setPreferredSize(new Dimension(150, 60));
jb1.setMaximumSize(new Dimension(150, 60));
jb2 = new JButton("Author");
jb2.setMinimumSize(new Dimension(140, 60));
jb2.setPreferredSize(new Dimension(150, 60));
jb2.setMaximumSize(new Dimension(150, 60));
jb3 = new JButton("Title");
jb3.setMinimumSize(new Dimension(140, 60));
jb3.setPreferredSize(new Dimension(150, 60));
jb3.setMaximumSize(new Dimension(150, 60));
jp1.add(Box.createRigidArea(new Dimension(300, 0)));
jp1.add(jb1);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb2);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb3);
}
public static void main(String[] args) {
Library shoe = new Library();
}
}
but I want to move them up to the top of my frame.
默认情况下,框架的内容窗格是 BorderLayout,所以我会保留它作为布局,然后只为按钮创建一个面板并将此面板添加到框架的顶部。
JPanel panel = new JPanel( new FlowLayout() );
panel.add(button1)
...
add(panel, BorderLayout.PAGE_START);
阅读有关 How to Use BorderLayout 的 Swing 教程部分,了解更多信息和工作示例。
I am using a BoxLayout in the JPanel,
但是,如果您想使用 BoxLayout 来实现,则必须告诉 BoxLayout 如何垂直对齐每个组件。 JButton 的默认值是将其对齐到可用 space.
的中心
如果您希望它位于顶部,则需要更改每个按钮:
jb1.setAlignmentY(0.0f);
此外,不要在面板的开头硬编码 "rigid area"。相反,您想在面板的开头和结尾使用 Box.createHorizontalGlue()
。然后组件将随着框架宽度的变化而调整。
同样,本教程有一个关于 How to Use BoxLayout
的部分将解释上述内容。
使用button_name.setAlignmentY(TOP_ALIGNMENT); // 对于所有三个按钮,因此您的代码更改为:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
public class Library extends JFrame {
private JFrame jf1;
private JPanel jp1;
private JButton jb1;
private JButton jb2;
private JButton jb3;
public Library() {
jf1 = new JFrame("Library");
jf1.setVisible(true);
jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf1.setSize(1080, 900);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
jf1.setLocation(dim.width/2-jf1.getSize().width/2, dim.height/2-jf1.getSize().height/2);
jp1 = (JPanel) jf1.getContentPane();
jp1.setLayout(new BoxLayout(jp1, BoxLayout.LINE_AXIS));
jb1 = new JButton("Genre");
jb1.setMinimumSize(new Dimension(140, 60));
jb1.setPreferredSize(new Dimension(150, 60));
jb1.setMaximumSize(new Dimension(150, 60));
jb1.setAlignmentY(TOP_ALIGNMENT);
jb2 = new JButton("Author");
jb2.setMinimumSize(new Dimension(140, 60));
jb2.setPreferredSize(new Dimension(150, 60));
jb2.setMaximumSize(new Dimension(150, 60));
jb2.setAlignmentY(TOP_ALIGNMENT);
jb3 = new JButton("Title");
jb3.setMinimumSize(new Dimension(140, 60));
jb3.setPreferredSize(new Dimension(150, 60));
jb3.setMaximumSize(new Dimension(150, 60));
jb3.setAlignmentY(TOP_ALIGNMENT);
jp1.add(Box.createRigidArea(new Dimension(300, 0)));
jp1.add(jb1);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb2);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb3);
}
public static void main(String[] args) {
Library shoe = new Library();
}
在我的程序中,我需要三个按钮。我在 JPanel
中使用了 BoxLayout
,我已经设法将它们移动到屏幕的死点。它们尺寸正确,水平位置正确,但我想将它们移到框架的顶部。我应该用什么来做到这一点?
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
public class Library extends JFrame {
private JFrame jf1;
private JPanel jp1;
private JButton jb1;
private JButton jb2;
private JButton jb3;
public Library() {
jf1 = new JFrame("Library");
jf1.setVisible(true);
jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf1.setSize(1080, 900);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
jf1.setLocation(dim.width/2-jf1.getSize().width/2, dim.height/2-jf1.getSize().height/2);
jp1 = (JPanel) jf1.getContentPane();
jp1.setLayout(new BoxLayout(jp1, BoxLayout.LINE_AXIS));
jb1 = new JButton("Genre");
jb1.setMinimumSize(new Dimension(140, 60));
jb1.setPreferredSize(new Dimension(150, 60));
jb1.setMaximumSize(new Dimension(150, 60));
jb2 = new JButton("Author");
jb2.setMinimumSize(new Dimension(140, 60));
jb2.setPreferredSize(new Dimension(150, 60));
jb2.setMaximumSize(new Dimension(150, 60));
jb3 = new JButton("Title");
jb3.setMinimumSize(new Dimension(140, 60));
jb3.setPreferredSize(new Dimension(150, 60));
jb3.setMaximumSize(new Dimension(150, 60));
jp1.add(Box.createRigidArea(new Dimension(300, 0)));
jp1.add(jb1);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb2);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb3);
}
public static void main(String[] args) {
Library shoe = new Library();
}
}
but I want to move them up to the top of my frame.
默认情况下,框架的内容窗格是 BorderLayout,所以我会保留它作为布局,然后只为按钮创建一个面板并将此面板添加到框架的顶部。
JPanel panel = new JPanel( new FlowLayout() );
panel.add(button1)
...
add(panel, BorderLayout.PAGE_START);
阅读有关 How to Use BorderLayout 的 Swing 教程部分,了解更多信息和工作示例。
I am using a BoxLayout in the JPanel,
但是,如果您想使用 BoxLayout 来实现,则必须告诉 BoxLayout 如何垂直对齐每个组件。 JButton 的默认值是将其对齐到可用 space.
的中心如果您希望它位于顶部,则需要更改每个按钮:
jb1.setAlignmentY(0.0f);
此外,不要在面板的开头硬编码 "rigid area"。相反,您想在面板的开头和结尾使用 Box.createHorizontalGlue()
。然后组件将随着框架宽度的变化而调整。
同样,本教程有一个关于 How to Use BoxLayout
的部分将解释上述内容。
使用button_name.setAlignmentY(TOP_ALIGNMENT); // 对于所有三个按钮,因此您的代码更改为:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
public class Library extends JFrame {
private JFrame jf1;
private JPanel jp1;
private JButton jb1;
private JButton jb2;
private JButton jb3;
public Library() {
jf1 = new JFrame("Library");
jf1.setVisible(true);
jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf1.setSize(1080, 900);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
jf1.setLocation(dim.width/2-jf1.getSize().width/2, dim.height/2-jf1.getSize().height/2);
jp1 = (JPanel) jf1.getContentPane();
jp1.setLayout(new BoxLayout(jp1, BoxLayout.LINE_AXIS));
jb1 = new JButton("Genre");
jb1.setMinimumSize(new Dimension(140, 60));
jb1.setPreferredSize(new Dimension(150, 60));
jb1.setMaximumSize(new Dimension(150, 60));
jb1.setAlignmentY(TOP_ALIGNMENT);
jb2 = new JButton("Author");
jb2.setMinimumSize(new Dimension(140, 60));
jb2.setPreferredSize(new Dimension(150, 60));
jb2.setMaximumSize(new Dimension(150, 60));
jb2.setAlignmentY(TOP_ALIGNMENT);
jb3 = new JButton("Title");
jb3.setMinimumSize(new Dimension(140, 60));
jb3.setPreferredSize(new Dimension(150, 60));
jb3.setMaximumSize(new Dimension(150, 60));
jb3.setAlignmentY(TOP_ALIGNMENT);
jp1.add(Box.createRigidArea(new Dimension(300, 0)));
jp1.add(jb1);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb2);
jp1.add(Box.createRigidArea(new Dimension(20,0)));
jp1.add(jb3);
}
public static void main(String[] args) {
Library shoe = new Library();
}