【问题标题】:Somehow horizontal scrollbar is not coming up in JTable [duplicate]JTable中没有出现水平滚动条[重复]
【发布时间】:2014-07-22 10:47:05
【问题描述】:

请看下面的代码sn-p,

public class FrameFoo extends JFrame {
    private TableAdapter mAdapter;

    public FrameFoo() {
        HashMap<Integer, String> m = new HashMap<Integer, String>();

        m.put(1, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(2, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(3, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(4, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(5, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(6, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(7, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");

        mAdapter = new TableAdapter(m);

        initComponents();
    }

    private void initComponents() {

        mScrollPane = JScrollPane();
        mTable = new JTable();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new java.awt.Dimension(400, 200));
        setResizable(false);

        mTable.setModel(mAdapter);
        mTable.setRowHeight(35);
        mScrollPane.setViewportView(mTable);

        getContentPane().add(mScrollPane, BorderLayout.CENTER);

        pack();
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                 if ("Nimbus".equals(info.getName())) {
                     UIManager.setLookAndFeel(info.getClassName());
                     break;
                 }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } 

        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new FrameFoo().setVisible(true);
            }
        });
    }

    private JScrollPane mScrollPane;
    private JTable mTable;
}

还有这个;

public class TableAdapter extends AbstractTableModel {

    private Map<Integer, String> m;

    /*
     * Assume no changes (add/remove) to m will be made after initialization.
     */
    public TableAdapter(Map<Integer, String> m) {
        this.m = m;
    }

    public void notifyDataSetChanged() {
        fireTableDataChanged();
    }

    @Override
    public int getRowCount() {
        return m.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public String getValueAt(int rowIndex, int columnIndex) {

        if (columnIndex < 0 || columnIndex > 1) {
            throw new IllegalArgumentException();
        }

        return columnIndex == 0 ? rowIndex + 1 + "" : m.get(rowIndex + 1);
    }
}

现在,当我向表格添加数据时,它会在需要时显示垂直滚动条,但它没有显示水平滚动条,而是在最后一列中裁剪字符串。我不明白这里出了什么问题..

这就是它的样子,

【问题讨论】:

  • 可能需要覆盖 JScrollBars 策略,可能需要阻止某些内容(例如 PreferredSize 和使用的 LayoutManager),以便更好地帮助尽快发布 SSCCE/MCVE、简短、可运行、可使用 JTable/XxxTableModel 的硬编码值进行编译
  • 不要setPreferredSize;覆盖getPreferredScrollableViewportSize。
  • 是的,那个副本就是我认为的答案!
  • @CanadianDavid 在第一条评论中提出问题的解决方案对我不起作用..
  • 覆盖JTable 的getPreferredSize() 方法。覆盖 getPreferredSize() 而不是 setPreferredSize() 方法。

标签: java swing jtable jscrollpane tablemodel


【解决方案1】:

在FrameFoo 类中的mTable.setRowHeight(35); 之后添加以下代码

mTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        final TableColumnModel columnModel = mTable.getColumnModel();
        for (int column = 0; column < mTable.getColumnCount(); column++) {
            int width = 50; // Min width
            for (int row = 0; row < mTable.getRowCount(); row++) {
                TableCellRenderer renderer = mTable.getCellRenderer(row, column);
                Component comp = mTable.prepareRenderer(renderer, row, column);
                width = Math.max(comp.getPreferredSize().width, width);
            }
            columnModel.getColumn(column).setPreferredWidth(width);
        }

【讨论】:

  • 这工作..谢谢。你能给我一些关于这里发生了什么的链接吗?
  • @Rupesh:代码正在根据列中最大数据元素的大小调整列的大小。
  • @Rupesh, could you please give me some links - 也许Table Column Adjuster 会有所帮助。
猜你喜欢
  • 2017-02-06
  • 2011-01-28
  • 2012-05-06
  • 2015-10-27
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多