【问题标题】:Small Gap between Table and ScrollPane Border Java SwingTable 和 ScrollPane Border Java Swing 之间的小差距
【发布时间】:2018-09-16 08:19:43
【问题描述】:

我正在尝试将 JTable 插入到 JScrollPane 中,我看到表格的边框和滚动窗格之间有一个小间隙。在左侧,表格看起来与极左对齐。有人可以帮忙吗我解决这个问题。?

删除 setAutoResizeMode(JTable.AUTO_RESIZE_OFF) 可以解决此问题。但我需要将其关闭。

this.dataTable = new SortableTable(this);
    this.dataTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    this.dataTable.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
    scrollPane = new JScrollPane(dataTable,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setPreferredSize(new Dimension(900,250));
    scrollPane.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));

【问题讨论】:

  • 也许您喜欢的 900 尺寸小于容器的宽度*?
  • 好的。将preferredsize 设置为new Dimension(895, 250) 时..我没有看到任何差距。但我想知道是否有任何方法可以使表格适合滚动窗格任何尺寸。如果我将表格的首选大小设置为滚动窗格首选大小,我会看到一个不需要的滚动条。
  • 删除 setAutoResizeMode 行,Java 将调整它的大小
  • 问题是对话框不应该被允许调整大小。如果我删除 JTable 上的 AutoResizeMode 并且如果用户想要扩展任何列,因为列可能有太多数据,他们不会希望其他列改变它们的大小(收缩),而不是应该给出一个水平滚动条。所以我把它关掉了。
  • 1) scrollPane.setPreferredSize(new Dimension(900,250)); 这可能是问题的核心。请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是。)2)如需更好的帮助,请尽快发布minimal reproducible exampleShort, Self Contained, Correct Example

标签: java swing swingx jide


【解决方案1】:

当组件调整大小时,您只需在侦听器中设置调整大小模式。这是一个例子:

import java.awt.Window;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.TableColumn;

public class TableTest implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TableTest());
    }

    @Override
    public void run() {
        JTable table = new JTable(10, 3);
        final JScrollPane scroller = new JScrollPane(table);
        // update the resize mode when scroller is resized and window is shown
        scroller.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                Window win = SwingUtilities.windowForComponent(scroller);
                if (win != null && win.isVisible()) {
                    updateColumns(table);
                    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                }
            }
        });
        JFrame frm = new JFrame("Table");
        frm.add(scroller);
        frm.setSize(600, 400);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    // Transfer column widths from autoresize mode
    private void updateColumns(JTable table) {
        for (int i = 0; i < table.getColumnCount(); i++) {
            TableColumn col = table.getColumnModel().getColumn(i);
            col.setPreferredWidth(col.getWidth());
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2012-06-08
    • 2012-09-11
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多