【问题标题】:JTable- Resize row header when row is resizedJTable-调整行大小时调整行标题
【发布时间】:2013-12-30 12:02:13
【问题描述】:

我有一个 grid (JTable),它看起来像 MS Excel 的网格。我想允许用户调整行和列的大小。对于我简单地使用的列:

grid.getTableHeader().setResizingAllowed(true);

对于行,我从 here 中选择了 TableRowResizer 类,我正在使用这样的类:

new TableRowResizer(grid);

这很好用。但是,我有一个问题:调整行大小时,行标题也没有调整大小。

这是我制作行标题的方法:

    AbstractListModel lm = null;
    lm = new TableListModel(grid);
    final JList list = new JList(lm);
    list.setFixedCellWidth(60);         
    list.setFixedCellHeight(grid.getRowHeight());
    list.setCellRenderer(new TableRowHeaderRenderer(grid));
    list.setBackground(grid.getTableHeader().getBackground());
    scrollPane.setRowHeaderView(list);

这是TableRowHeaderRenderer 类:

    class TableRowHeaderRenderer extends JLabel implements ListCellRenderer {   

        private JTable table;

        public TableRowHeaderRenderer(JTable table)
        {
            this.table = table;
            JTableHeader header = table.getTableHeader();
            setOpaque(true);
            setBorder(BorderFactory.createEtchedBorder());
            setHorizontalAlignment(CENTER);
            setForeground(header.getForeground());
            setBackground(header.getBackground());
            setFont(header.getFont());
        }

        public Component getListCellRendererComponent(JList list, 
        Object value, int index, boolean isSelected, boolean cellHasFocus) 
        {
            Color bg = UIManager.getColor("TableHeader.background");
            int selectedrow =  table.getSelectedRow();
            if (selectedrow==index) bg = new Color(107, 142, 35);
            setBackground(bg);
            setText("" + Grid.getRowName(index));
            return this;
        }
        }

这是TableListModelclass:

    class TableListModel extends AbstractListModel{
        private JTable mytable;

        public TableListModel(JTable table) {
            super();
            mytable = table;
            }

        public int getSize() {
            return mytable.getRowCount();
            }

        public Object getElementAt(int index) {
            return "" + index;
            }
        }

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布 SSCCE,简短,可运行,可编译,具有 JTable 的硬编码值,除了 RowHeader 有三四个好的解决方法,不确定是否 setFixedCellWidth(60);阻止鼠标拖动的另一个事件

标签: java swing jtable rowheader


【解决方案1】:

查看Row Number Table。它使用 JTable(而不是 JList)来呈现行号。因此,您可以使行高与主表保持同步。

但是,当主表的行高发生更改时,我无法自动重新绘制行标题,因为更改单个行高时不会触发任何事件。因此,您还需要修改调整大小的代码,使其看起来像:

table.setRowHeight(resizingRow, newHeight);
JScrollPane scrollPane = (JScrollPane)SwingUtilities.getAncestorOfClass(JScrollPane.class, table);
scrollPane.getRowHeader().repaint();

【讨论】:

  • 一个很好的例子。谢谢。我已经使用JTable 更改了行标题渲染器,它工作正常。知道我只需要修改TableRowResizer 以便绘制行标题。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多