Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GridBagLayout将jButton相对于JTable水平居中_Java_Swing_Jtable_Jbutton_Gridbaglayout - Fatal编程技术网

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

Java 使用GridBagLayout将jButton相对于JTable水平居中,java,swing,jtable,jbutton,gridbaglayout,Java,Swing,Jtable,Jbutton,Gridbaglayout,我有一个JTable,我在下面放置了3个JButtons。我已经设法把左边的按钮放在左边,把右边的按钮放在右边,但是我不知道如何把中间的按钮放在中间。我尝试过使用.weightx和.anchor但没有任何结果 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColum

我有一个
JTable
,我在下面放置了3个
JButton
s。我已经设法把左边的按钮放在左边,把右边的按钮放在右边,但是我不知道如何把中间的按钮放在中间。我尝试过使用
.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);
  }  
}

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

  • 因为您扩展了
    JPanel
    ,并为整个 面板,您只需为按钮添加额外的行。看起来像 Web中的表布局—实际上是这样的。有赞成也有反对 具有表格布局。主要的缺点是很难在一个长期的项目中坚持下去。特别是,不能在其他地方重复使用按钮
  • 您可以按照@Izruo的建议,使用按钮创建其他面板。关键的特点是你可以很容易地将这个面板从网格的底部移动到左侧,添加到另一个类似的面板/菜单等。最简单的就足够了。创建
    按钮面板后,您可以
    
    • 将其添加到网格中。它比仅表格布局稍好一些
    • 创建同时包含GridPanel和ButtonPanel的CompositePanel

在研究中,我注意到最后一个选项更可取。根据我个人的经验,这是一个最佳实践

正如上面评论中所建议的那样,您可以使用另一个
JPanel
用于3
JButton
s

对于
JPanel
使用
BoxLayout
,它将包含3个
JButton
s,并且在每个
JButton
之间,您可以获得以下输出:

在这种情况下:

  • 创建一个新的
    JPanel

    JPanel buttonsPane;
    
  • 初始化它并将其布局设置为
    BoxLayout

    buttonsPane = new JPanel();
    buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));
    
  • 添加按钮以及它们之间的
    Box.createHorizontalGlue()

    buttonsPane.add(bAdd);
    buttonsPane.add(Box.createHorizontalGlue());
    buttonsPane.add(bMod);
    buttonsPane.add(Box.createHorizontalGlue());
    buttonsPane.add(bDel);
    
  • 按钮平面
    添加到
    JFrame
    SOUTH
    对齐中(或将其与当前
    JPanel
    一起添加,并编辑其约束条件(我使用了前者)):


  • 实现类似结果的另一种方法(根据下面的@MadProgrammer注释)是更改约束并在
    JButton
    s之间添加“空”组件:

    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);
    
    产生:


    您可以为按钮引入额外的
    JPanel
    ,并为其提供单独的
    LayoutManager
    。不幸的是,我不知道是否有一个内置的可以完全满足您的需要。@Izruo我已经尝试使用另一个JPanel和BoxLayout来实现JButtons。不幸的是,我得到的只是将3个按钮居中,因为JPanel与JScrollPane的大小不匹配。不管怎样,谢谢你的建议。就我个人而言,我会使用
    GridBagLayout
    作为
    按钮平面,但那只是我;)@如果我接受建议,我总是学习新东西,我能知道你喜欢的原因吗?在这种情况下,这是我能想到的最简单的方法of@Frakcool. 谢谢你的回答。我还必须将扩展JPanel的布局更改为BoxLayout。出于某种原因,尽管进行了您建议的更改,但它无法与GridBagLayout一起工作。@potato请参见更新的答案:)它也可以工作,而无需仅为
    JButton创建新的
    JPanel
    s@Frakcool遗憾的是,很多UI设计都归结为“个人偏好”:P
    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);