我在JTable内的JScrollPane内有一个JInternalFrame
如何更改JTable的滚动位置

以下是我的代码:

private void scrollToNewRow(JTable table, int row, int col) {
    if (table.getParent() != null) {
        if (table.getParent() instanceof JScrollPane) {
            JScrollPane sp = (JScrollPane) table.getParent();
            if (sp == null)
                return;
            JViewport viewport = sp.getViewport();
            Rectangle r = table.getCellRect(row, col, true);
            Point p = viewport.getViewPosition();
            r.setLocation(r.x - p.x, r.y - p.y + table.getRowHeight());
            viewport.scrollRectToVisible(r);
        }
    }
}


但这是行不通的。
但是,当我在JFrame中应用相同的代码时,一件事很完美。请建议我如何在JInternalFrame中实现这一目标。

最佳答案

这对我来说可以。这是我编写的示例代码(匆忙中,仅测试材料-抱歉,未评论):

public class InternalFrameTest extends JFrame
{
    public InternalFrameTest()
    {
        setSize(new Dimension(800, 600));
        getContentPane().setLayout(new BorderLayout());
        final JPanel panel = new JPanel(new GridBagLayout());
        final JDesktopPane dp = new JDesktopPane();
        final JInternalFrame internalFrame = new JInternalFrame("Toto");
        dp.add(internalFrame);
        internalFrame.setBounds(10, 10, 700, 500);
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        Vector<String> columns = new Vector<String>();
        columns.addElement("name");
        for (int i = 0; i < 100; i++)
        {
            Vector<String> elem = new Vector<String>();
            elem.addElement("" + i);
            data.addElement(elem);
        }
        final JTable table = new JTable(data, columns);
        final JScrollPane sp = new JScrollPane(table);
        internalFrame.add(sp);
        internalFrame.show();
        final JButton b = new JButton("GO!");
        b.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent pEvent)
            {
                JViewport viewport = sp.getViewport();
                Rectangle r = table.getCellRect(50, 1, true);
                Point p = viewport.getViewPosition();
                r.setLocation(r.x - p.x, r.y - p.y + table.getRowHeight());
                viewport.scrollRectToVisible(r);
            }
        });
        panel.add(dp, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
        panel.add(b, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
        getContentPane().add(panel);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new InternalFrameTest();
    }
}


单击按钮确实会将表格滚动到所需的单元格。
也许更多有关其余代码的细节可能会有所帮助。但是那部分代码可能不是问题。

10-07 19:12
查看更多