有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JTable不会滚动到最下面一行

我在JScrollPane中有一个JTable with,我想通过编程滚动到表的底部。我尝试的代码是:

int bottomRow = table.getRowCount()-1;
Rectangle rect = table.getCellRect(bottomRow,0,true);
table.scrollRectToVisible(rect);

我还尝试了以下代码:

int bottomRow = table.getRowCount()-1;
Rectangle rect = table.getCellRect(bottomRow,0,true);
jscrollPane1.getViewPort().setViewPosition(rect.getLocation());

这两个代码段的行为都是相同的,并且都将表格滚动到底部行,而不是底部行上方的几行,具体取决于矩形的高度

我需要帮助以可见矩形查看表的最后一行


共 (2) 个答案

  1. # 1 楼答案

    疯狂猜测(因为您没有提供足够的上下文),当收到关于tableModel中的更改的通知时,您希望更新滚动值

    在这种情况下,问题是表本身正在侦听模型以更新其内部。由于您希望根据表本身的状态更改某些内容,因此必须确保只有在内部完全更新后才执行操作,例如:

    public void tableChanged(TableModelEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // scroll to last row
            }
        });
    }
    
  2. # 2 楼答案

    我写这个简单的例子是为了展示一个可行的解决方案,鉴于这个问题没有进一步的发展,我将把它作为一个工作示例发布,希望它能从OP中得到更多的信息

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.table.DefaultTableModel;
    
    public class ToLastRow {
    
        public static void main(String[] args) {
            new ToLastRow();
        }
    
        public ToLastRow() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    DefaultTableModel model = new DefaultTableModel(new Object[]{"Look no hands..."}, 0);
                    for (int index = 0; index < 1000; index++) {
                        model.addRow(new Object[]{index});
                    }
    
                    final JTable table = new JTable(model);
    
                    JButton last = new JButton("Last");
                    JButton first = new JButton("First");
    
                    last.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            int row = table.getRowCount() - 1;
                            scrollTo(table, row);
                        }
                    });
                    first.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            scrollTo(table, 0);
                        }
                    });
    
                    JPanel buttons = new JPanel();
                    buttons.add(last);
                    buttons.add(first);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new JScrollPane(table));
                    frame.add(buttons, BorderLayout.SOUTH);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public void scrollTo(JTable table, int row) {
            Rectangle bounds = table.getCellRect(row, 0, true);
            table.scrollRectToVisible(bounds);
            table.addRowSelectionInterval(row, row);
        }
    }