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

标签 java swing jscrollpane layout-manager gridbaglayout

我有一个带有GridBagLayoutJPanel。该面板包含 2 行,第一行有一个 JLabel,第二行有一个 JScrollPane,里面有 JTable。该表未填充 100% 的滚动 Pane 。即使我调整框架大小,滚动 Pane 也会调整大小,但里面的表格始终具有固定宽度。

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

下面是添加到面板时应用于滚动 Pane 的网格包约束。

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;

出了什么问题?滚动 Pane 或表格有问题吗?

最佳答案

我认为只有(注意行永远不会通过使用任何 LayoutManager 调整大小,只有列)

c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 0;

GBC 不是 JComponents 实现 Scrollable 的合适 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,看我的代码编辑,然后为所有 LayoutManager

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

  • 否则使用 new Dimension(int, int) 而不是 table.getPreferredSize()

  • 缩小

.

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;
        JScrollPane pane = new JScrollPane(table);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        panel.add(pane, 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();
            }
        });
    }
}

编辑 2

我强烈建议使用 BorderLayout, GridLayout

enter image description here

.

enter image description here

代替GBC(JTableJScollPaneJComboBox不能返回合理的PreferredSize,需要覆盖GBC,brrrr,不用担心)

enter image description here . enter image description here

BorderLayout 代码

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();
            }
        });
    }
}

关于java - JTable 不填充使用 GridBagLayout 添加到 JPanel 的 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16643845/

相关文章:

java - 如何通过JSON获取特定格式的数据

java - JPA 二级表问题

java - JPanel 在调整大小时不刷新图形组件

java - 如果未使用 Swing 事件,如何返回该事件?

java - JScrollPane 中的 JTextArea 将不会显示

java - 将 JScrollPane 滚动条移至右侧 SWING

java - 使用插入和更新重载函数

java - 使用 Java Web Start 部署应用程序

Java:如何在不使用 actionListener 的情况下检测到用户已经完成了他们的保存名称?

jquery - chrome中的jScrollPane 2.0高度问题