Java:使用BoxLayout在JPanel中垂直移动JButton

时间:2016-12-22 06:04:56

标签: java swing jframe jpanel jbutton

在我的程序中,我需要有三个按钮。我在BoxLayout中使用JPanel,我设法将它们移动到屏幕的死点。它们的大小正确并处于正确的水平位置,但我想将它们移动到我的框架顶部。我应该怎么做才能做到这一点?

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();
    }
}

2 个答案:

答案 0 :(得分:3)

  

但我希望将它们移到我的框架顶部。

默认情况下,框架的内容窗格是BorderLayout,所以我会将其保留为布局,然后只需为按钮创建一个面板,并将此面板添加到框架的顶部。

JPanel panel = new JPanel( new FlowLayout() );
panel.add(button1)
...
add(panel, BorderLayout.PAGE_START);

阅读How to Use BorderLayout上Swing教程中的部分,了解更多信息和工作示例。

  

我在JPanel中使用BoxLayout,

但是如果你想通过使用BoxLayout来实现它,那么你必须告诉BoxLayout如何垂直对齐每个组件。 JButton的默认值是将其对齐在可用空间的中心。

如果您想要它在顶部,那么您需要更改每个按钮:

jb1.setAlignmentY(0.0f);

另外,请勿对面板开头的“刚性区域”进行硬编码。相反,您希望在面板的开头和结尾使用Box.createHorizontalGlue()。然后,组件将随着框架宽度的变化而调整。

同样,本教程还有一个关于How to Use BoxLayout的部分,它将解释上述内容。

答案 1 :(得分:-1)

使用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();
    }