Java JTable不填充使用GridBagLayout添加到JPanel的JScrollPane

Java JTable不填充使用GridBagLayout添加到JPanel的JScrollPane,java,swing,jscrollpane,layout-manager,gridbaglayout,Java,Swing,Jscrollpane,Layout Manager,Gridbaglayout,我有一个JPanel和GridBagLayout。该面板包含两行,第一行有一个JLabel,第二行有一个JScrollPane,内有JTable。该表未填满滚动窗格的100%。即使我调整了框架的大小,滚动窗格也会调整大小,但是里面的表格总是有固定的宽度 JTable table=new JTable(myModel); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane scroll=new JScrollPane(tabl

我有一个
JPanel
GridBagLayout
。该面板包含两行,第一行有一个JLabel,第二行有一个
JScrollPane
,内有
JTable
。该表未填满滚动窗格的100%。即使我调整了框架的大小,滚动窗格也会调整大小,但是里面的表格总是有固定的宽度

JTable table=new JTable(myModel);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
JScrollPane scroll=new JScrollPane(table);

JPanel panel=new JPanel(new GridBagLayout());
// component add details skipped
以下是添加到面板时应用于滚动窗格的网格包约束

GridBagConstraints gbc=new GridBagConstraints();
gbc.gridx=0; // first column
gbc.gridy=1; // second row
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.fill=GridBagConstraints.BOTH;
gbc.anchor=GridBagConstraints.NORTHEAST;
gbc.weightx=1.0;
gbc.weighty=1.0;
出了什么问题?滚动窗格或表格有问题吗?

我认为只有这样(注意,使用任何LayoutManager都不会调整行的大小,只有列)

GBC不是适合JComponents的LayoutManager实现可滚动,请对这些JComponents使用BorderLayout(ev GridLayout)

比如说

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

public class JTableAndGBC {

    private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"};
    private JTable table;
    private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01},
        {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}};
    private DefaultTableModel model = new DefaultTableModel(data, columnNames);

    public JTableAndGBC() {
        JPanel panel = new JPanel(new GridBagLayout());
        table = new JTable(model);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(table, gbc);
        JFrame frame = new JFrame();
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) throws Exception {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JTableAndGBC();
            }
        });
    }
}
编辑1

  • JTable
    JScollPane
    JComboBox
    无法返回合理的
    PreferredSize
    ,请查看编辑中的“我的代码”,然后查看所有
    布局管理器的WOKR

  • 请仔细注意
    table.setPreferredScrollableViewportSize(table.getPreferredSize()),我建议测试尺寸是否重载所需坐标或屏幕分辨率:-)

  • 否则,使用
    新维度(int,int)
    而不是
    表进行收缩。getPreferredSize()

编辑2

我强烈建议使用BorderLayout、GridLayout

代替GBC(
JTable
JScollPane
JComboBox
无法返回合理的
PreferredSize
,需要覆盖GBC、brrrr,不必麻烦)

边界布局代码

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

public class JTableAndGBC {

    private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"};
    private JTable table;
    private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01},
        {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}};
    private DefaultTableModel model = new DefaultTableModel(data, columnNames);

    public JTableAndGBC() {
        JPanel panel = new JPanel(new BorderLayout()/*(new GridBagLayout()*/);
        table = new JTable(model);
        //GridBagConstraints gbc = new GridBagConstraints();
        //gbc.weightx = 1.0;
        //gbc.fill = GridBagConstraints.HORIZONTAL;
        JScrollPane pane = new JScrollPane(table, 
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        /*TableColumn firstColumn = table.getColumnModel().getColumn(0);
        firstColumn.setMinWidth(150);
        firstColumn.setMaxWidth(200);
        TableColumn secondColumn = table.getColumnModel().getColumn(1);
        secondColumn.setMinWidth(200);
        secondColumn.setMaxWidth(250);
        TableColumn thirdColumn = table.getColumnModel().getColumn(1);
        thirdColumn.setMinWidth(50);
        thirdColumn.setMaxWidth(100);   */     
        table.setRowHeight(30);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        panel.add(pane/*, gbc*/);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) throws Exception {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JTableAndGBC();
            }
        });
    }
}
移除

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

线路。这会导致固定的表大小。

感谢您提供宝贵的建议。我找到了这个问题的确切解决办法。以其首选大小或视图端口大小调整表的大小,以较大者为准。无论您使用什么布局管理器,它都可以正常工作

解决方案是使用
getScrollableTracksViewportWidth()方法定义表,如下例所示:

JTable table=new JTable(myModel){
 public boolean getScrollableTracksViewportWidth() {
   return getPreferredSize().width < getParent().getWidth();
 }
};
JScrollPane scroll=new JScrollPane(table);
JTable表=新的JTable(myModel){
公共布尔值getScrollableTracksViewportWidth(){
返回getPreferredSize().width
您是否已将滚动窗格添加到面板中?为了更快地获得更好的帮助,请发布一个.Where is
面板.add(滚动)
?问题中跳过的组件添加详细信息<代码>面板。添加(滚动,gbc)然后发布一个SSCCE,这样我们就可以重现这个问题。你怎么说滚动窗格有问题?因为在我的代码中,jscrollpane可以完美地调整水平和垂直方向的大小。但是jtable(在jscrollpane中)没有。是的,这是可能的,没有任何问题,这是关于如何布局UotManager worksfound解决方案的基本知识,表应设置其首选大小或更大的视图端口大小,因此,在任何情况下,它都会填满滚动窗格的整个宽度。这实际上并不能解决问题。我遇到的问题是,当滚动窗格中没有行时,JTable的宽度不足以填满滚动窗格。这使得接收DRAGNDOP MSG变得困难。这完美地解决了这个问题。
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
JTable table=new JTable(myModel){
 public boolean getScrollableTracksViewportWidth() {
   return getPreferredSize().width < getParent().getWidth();
 }
};
JScrollPane scroll=new JScrollPane(table);