如何在GridBagLayout的左上角单元格中放置一个包含三个按钮的面板?

时间:2016-06-02 09:39:10

标签: java swing

我有一个包含三个按钮的面板。我希望此面板放在GridBagLayout的左上角单元格中。

我的问题是,当我运行程序时,面板不在左上角的单元格中,而是位于布局的中间。我已将gridxgridy都设置为零。

private JFrame frame;

private JMenuBar menuBar;
private JMenu menuFile;
private JMenuItem fileItem1;
private JMenuItem fileItem2;

private JPanel btnPanel;
private JButton btnRewind;
private JButton btnPlayPause;
private JButton btnFastForward;

private static boolean shouldFill = true;
private static boolean shouldWeightX = true;
private static boolean RIGHT_TO_LEFT = false;

public JPlayer() {

}

public void createAndShowGUI() {
    frame = new JFrame();
    frame.setTitle("JPlayer");
    frame.setSize(500, 500);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    addComponentsToPane(frame.getContentPane());

    frame.setVisible(true);
}

private void addComponentsToPane(Container pane) {
    if(RIGHT_TO_LEFT) {
        pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    }

    pane.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    if(shouldFill) {
        gbc.fill = GridBagConstraints.HORIZONTAL;
    }

    btnRewind = new JButton();
    try {
        Image imgRewind = ImageIO.read(getClass().getResource("../utils/images/rewind.png"));

        btnRewind.setIcon(new ImageIcon(imgRewind));
        btnRewind.setOpaque(true);
        btnRewind.setContentAreaFilled(false);
        btnRewind.setBorderPainted(false);
    } catch(Exception e) {
        e.printStackTrace();
    }

    btnPlayPause = new JButton();
    try {
        Image imgPlay = ImageIO.read(getClass().getResource("../utils/images/play.png"));
        Image imgPause = ImageIO.read(getClass().getResource("../utils/images/pause.png"));

        btnPlayPause.setIcon(new ImageIcon(imgPlay));
        btnPlayPause.setOpaque(true);
        btnPlayPause.setContentAreaFilled(false);
        btnPlayPause.setBorderPainted(false);
    } catch(Exception e) {
        e.printStackTrace();
    }

    btnFastForward = new JButton();
    try {
        Image imgFastForward = ImageIO.read(getClass().getResource("../utils/images/fast_forward.png"));

        btnFastForward.setIcon(new ImageIcon(imgFastForward));
        btnFastForward.setOpaque(true);
        btnFastForward.setContentAreaFilled(false);
        btnFastForward.setBorderPainted(false);
    } catch(Exception e) {
        e.printStackTrace();
    }

    btnPanel = new JPanel();
    btnPanel.add(btnRewind);
    btnPanel.add(btnPlayPause);
    btnPanel.add(btnFastForward);
    btnPanel.setSize(new Dimension(40, 40));
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 0;
    gbc.gridy = 0;

    JButton btn = new JButton("Some Button");
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 0;

    pane.add(btnPanel, gbc);
    pane.add(btn, c);
}

1 个答案:

答案 0 :(得分:3)

尝试将GridBagConstraints.anchor约束作为CENTER定位的默认值。

直接来自How to Use GridBagLayout

的文档
  

如果组件的显示区域大于组件本身,则可以使用GridBagConstraints.anchor约束在显示区域中指定组件的显示位置。

     

锚点约束的值可以是绝对的(北,南,东,西等),或方向相对(在页面,在行尾,在第一行的开头,依此类推,或相对于组件的基线。

enter image description here

注意

  1. 您不需要使用 GridBagConstraints 的多个实例。只需创建一个并在面板中添加组件之前更新约束。通过这种方式,您可以重用现有的所有约束条件。

  2. 请勿忘记将weightxweighty设置为正确使用anchor约束。

  3. 直接来自相同的文档

    weightx,重量

      

    指定权重是一种艺术,可以对GridBagLayout控制的组件的外观产生重大影响。权重用于确定如何在列(weightx)和行(weighty)之间分配空间;这对于指定调整大小行为非常重要。

         

    除非您为 weightx weighty 指定至少一个非零值,否则所有组件在其容器的中心聚集在一起 。这是因为当权重为0.0(默认值)时,GridBagLayout会在其单元格网格与容器边缘之间放置任何额外空间。