使用GridBagLayout相对于JTable水平居中jButton

时间:2018-02-12 20:16:29

标签: java swing jtable jbutton gridbaglayout

我有一个JTable并且我在它下面放了3 JButton个。我已经设法将左侧按钮放在左上角,右侧按钮放在右侧角落,但我无法弄清楚如何将中间按钮放在中间位置。我尝试过使用.weightx.anchor而没有任何结果。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class AccessView extends JPanel{
  String[] columnNames = {"Date","Time","Type of access"};
  DefaultTableModel tableModel;
  JTable tAccesses;
  JScrollPane scrollPane;
  JButton bAdd, bMod, bDel;

  public AccessView(){
    createGUI();
  }

   public void createGUI(){
    this.setBorder(BorderFactory.createTitledBorder("Accesses"));
    this.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    bAdd = new JButton("Add");
    bMod = new JButton("Mod");
    bDel = new JButton("Del");

    tableModel = new DefaultTableModel(25,columnNames.length);
    tableModel.setColumnIdentifiers(columnNames);   
    tAccesses = new JTable(tableModel);
    scrollPane = new JScrollPane(tAccesses);

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3;
    this.add(scrollPane, c);

    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    c.anchor = GridBagConstraints.LAST_LINE_START;
    this.add(bAdd, c);

    c.gridx = 1;
    c.gridy = 1;
    this.add(bMod, c);

    c.gridx = 2;
    c.gridy = 1;
    c.anchor = GridBagConstraints.LAST_LINE_END;
    this.add(bDel, c);
  }  
}

2 个答案:

答案 0 :(得分:3)

根据上面的评论中的建议,您可以使用另外JPanel作为3 JButton

BoxLayout使用JPanel,其中包含3 JButtonBox.createHorizontalGlue() JButton之间的JPanel,您可以获得以下输出:

enter image description here

在这种情况下:

  1. 创建新的JPanel buttonsPane;

    BoxLayout
  2. 初始化并将其布局设置为buttonsPane = new JPanel(); buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));

    Box.createHorizontalGlue()
  3. 在它们之间添加按钮和buttonsPane.add(bAdd); buttonsPane.add(Box.createHorizontalGlue()); buttonsPane.add(bMod); buttonsPane.add(Box.createHorizontalGlue()); buttonsPane.add(bDel);

    buttonsPane
  4. JFrame添加到SOUTH JPanel对齐方式(或将其与当前frame.add(this); frame.add(buttonsPane, BorderLayout.SOUTH); 一起添加,然后修改其约束条件(I使用前者)):

    JButton
  5. 你可以获得类似结果的另一种方法(根据下面的@MadProgrammer评论)将改变你的约束并添加"空" c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.weightx = 1; this.add(bAdd, c); c.gridx = 1; this.add(new JLabel(""), c); //Empty component just for the extra space c.gridx = 2; this.add(bMod, c); c.gridx = 3; this.add(new JLabel(""), c); //Empty component just for the extra space c.gridx = 4; this.add(bDel, c); s:

    之间的组件
    resolveMaxAttempts()

    产生:

    enter image description here

答案 1 :(得分:0)

有一些方法可以做到这一点:

  • 由于您扩展了JPanel并拥有GridBagLayout整体 面板,你可以为按钮添加额外的行。看起来像 Web中的表格布局 - 实际上是。有赞成和反对 与表格布局。主要缺点是在长期项目中难以保留。特别是,您无法在其他地方重复使用按钮。
  • 您可以创建带按钮的其他面板,如@Izruo建议的那样。关键功能是您可以轻松地从网格的底部向左移动此面板,添加到另一个类似的面板/菜单等。最简单的FlowLayout就足够了。创建ButtonPanel后,您可以
    • 将其添加到您的网格中。它比仅用于表格的布局
    • 略胜一筹
    • 创建 CompositePanel ,其中包含 GridPanel ButtonPanel

学习Oracle tutorial我注意到最后一个选项更可取。根据我的个人经验,这是一种最佳实践