我有一个包含三个按钮的面板。我希望此面板放在GridBagLayout
的左上角单元格中。
我的问题是,当我运行程序时,面板不在左上角的单元格中,而是位于布局的中间。我已将gridx
和gridy
都设置为零。
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);
}
答案 0 :(得分:3)
尝试将GridBagConstraints.anchor约束作为CENTER定位的默认值。
的文档如果组件的显示区域大于组件本身,则可以使用
GridBagConstraints.anchor
约束在显示区域中指定组件的显示位置。锚点约束的值可以是绝对的(北,南,东,西等),或方向相对(在页面,在行尾,在第一行的开头,依此类推,或相对于组件的基线。
注意:
您不需要使用 GridBagConstraints 的多个实例。只需创建一个并在面板中添加组件之前更新约束。通过这种方式,您可以重用现有的所有约束条件。
请勿忘记将weightx
和weighty
设置为正确使用anchor
约束。
直接来自相同的文档
weightx,重量
指定权重是一种艺术,可以对GridBagLayout控制的组件的外观产生重大影响。权重用于确定如何在列(weightx)和行(weighty)之间分配空间;这对于指定调整大小行为非常重要。
除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件在其容器的中心聚集在一起 。这是因为当权重为0.0(默认值)时,GridBagLayout会在其单元格网格与容器边缘之间放置任何额外空间。