我在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();
}
}
单击按钮确实会将表格滚动到所需的单元格。
也许更多有关其余代码的细节可能会有所帮助。但是那部分代码可能不是问题。