Java JTable自动滚动至底部
我有一个JPanel,其中包含3个JScrollPane(每个包含一个Jtable)和一个boxlayout,因此我在一个页面中看到3个表,我动态加载数据,3个表的代码逻辑几乎相同,只有列名和一些单元格呈现不同,对于每个表,我希望在向表中添加新行时自动滚动到表的底部,前两个表工作正常,滚动条进入表的底部,但最后一个表的滚动条会做一些奇怪的事情!我对3个表使用完全相同的滚动方法,但前2个工作-这不工作 有什么想法吗 为了清晰起见,我删除了一些添加代码的专栏,但这就是我的想法Java JTable自动滚动至底部,java,swing,scroll,jtable,Java,Swing,Scroll,Jtable,我有一个JPanel,其中包含3个JScrollPane(每个包含一个Jtable)和一个boxlayout,因此我在一个页面中看到3个表,我动态加载数据,3个表的代码逻辑几乎相同,只有列名和一些单元格呈现不同,对于每个表,我希望在向表中添加新行时自动滚动到表的底部,前两个表工作正常,滚动条进入表的底部,但最后一个表的滚动条会做一些奇怪的事情!我对3个表使用完全相同的滚动方法,但前2个工作-这不工作 有什么想法吗 为了清晰起见,我删除了一些添加代码的专栏,但这就是我的想法 private JSc
private JScrollPane fillThirdTable(ArrayList<DisplayVariable> displayList) {
DefaultTableModel model = new DefaultTableModel();
ToolTipTable answer = new ToolTipTable(model);
answer.setRowHeight(60);
answer.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
answer.setSize(1300, 400);
DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
dtcr.setHorizontalAlignment(SwingConstants.CENTER);
answer.getColumn("Display Variable ID").setCellRenderer(dtcr);
JScrollPane scrollPane = null;
for (DisplayVariable var : displayList) {
model.addRow(new Object[] { id, shown, name, value });
answer.setFillsViewportHeight(true);
}
TableColumn c= answer.getColumnModel().getColumn(3);
c.setCellRenderer(new MultiLineCellRenderer());
TableColumn c2= answer.getColumnModel().getColumn(2);
c2.setCellRenderer(new MultiLineCellRenderer());
scrollPane = new JScrollPane(answer);
scrollPane.setSize(1300, 400);
//here I call the method
scrollToVisible(answer, (displayList.size()-1), 1);
return scrollPane;
}
我看不出你们在谈论什么,这只是一个完整的例子 例如(这里也有三个jtable,但另一个故事)
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.DefaultTableModel;
公共类TableSelection实现ListSelectionListener{
私有JTable[]表;
私有布尔忽略=false;
公共选举(){
对象[][]数据1=新对象[100][5];
对象[][]数据2=新对象[50][5];
对象[][]数据3=新对象[50][5];
对于(int i=0;i=0;){
if(rowKey.equals(table.getValueAt(row,col))){
表.更改选择(行、列、假、假);
回来
}
}
表1.1选举();
}
@凌驾
public void值已更改(ListSelectionEvent e){
如果(如getValueIsAdjusting()| |忽略){
回来
}
忽略=真;
试一试{
JTable table=getTable(如getSource());
int row=table.getSelectedRow();
字符串rowKey=table.getValueAt(行,table.convertColumnIndexToView(0)).toString();
for(表t:表格){
if(t==表){
持续
}
更改选择(t,行键);
JViewport=(JViewport)t.getParent();
矩形rect=t.getCellRect(t.getSelectedRow(),0,true);
矩形r2=viewport.getVisibleRect();
t、 scrollRectToVisible(新矩形(rect.x,rect.y,(int)r2.getWidth(),(int)r2.getHeight());
System.out.println(新矩形(viewport.getExtentSize()).contains(rect));
}
}最后{
忽略=错误;
}
}
公共静态void main(字符串[]args){
TableSelection TableSelection=新TableSelection();
}
}
我看不到您所谈论的内容,这只是示例的完整副本
例如(这里也有三个jtable,但另一个故事)
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.DefaultTableModel;
公共类TableSelection实现ListSelectionListener{
私有JTable[]表;
私有布尔忽略=false;
公共选举(){
对象[][]数据1=新对象[100][5];
对象[][]数据2=新建
public void scrollToVisible(JTable table, int rowIndex, int vColIndex) {
if (!(table.getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport)table.getParent();
// This rectangle is relative to the table where the
// northwest corner of cell (0,0) is always (0,0).
Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);
// The location of the viewport relative to the table
Point pt = viewport.getViewPosition();
// Translate the cell location so that it is relative
// to the view, assuming the northwest corner of the
// view is (0,0)
rect.setLocation(rect.x-pt.x, rect.y-pt.y);
// Scroll the area into view
viewport.scrollRectToVisible(rect);
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;
public class TableSelection implements ListSelectionListener {
private JTable[] tables;
private boolean ignore = false;
public TableSelection() {
Object[][] data1 = new Object[100][5];
Object[][] data2 = new Object[50][5];
Object[][] data3 = new Object[50][5];
for (int i = 0; i < data1.length; i++) {
data1[i][0] = "Company # " + (i + 1);
for (int j = 1; j < data1[i].length; j++) {
data1[i][j] = "" + (i + 1) + ", " + j;
}
}
for (int i = 0; i < data2.length; i++) {
data2[i][0] = "Company # " + ((i * 2) + 1);
for (int j = 1; j < data2[i].length; j++) {
data2[i][j] = "" + ((i * 2) + 1) + ", " + j;
}
}
for (int i = 0; i < data3.length; i++) {
data3[i][0] = "Company # " + (i * 2);
for (int j = 1; j < data3[i].length; j++) {
data3[i][j] = "" + (i * 2) + ", " + j;
}
}
String[] headers = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"};
DefaultTableModel model1 = new DefaultTableModel(data1, headers);
DefaultTableModel model2 = new DefaultTableModel(data2, headers);
DefaultTableModel model3 = new DefaultTableModel(data3, headers);
final JTable jTable1 = new JTable(model1);
jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JScrollPane sp1 = new JScrollPane();
sp1.setPreferredSize(new Dimension(600, 200));
sp1.setViewportView(jTable1);
final JTable jTable2 = new JTable(model2);
jTable2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JScrollPane sp2 = new JScrollPane();
sp2.setPreferredSize(new Dimension(600, 200));
sp2.setViewportView(jTable2);
final JTable jTable3 = new JTable(model3);
jTable3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JScrollPane sp3 = new JScrollPane();
sp3.setPreferredSize(new Dimension(600, 200));
sp3.setViewportView(jTable3);
//TableSelection tableSelection = new TableSelection(jTable1, jTable2, jTable3);
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(3, 0, 10, 10));
panel1.add(sp1);
panel1.add(sp2);
panel1.add(sp3);
JFrame frame = new JFrame("tableSelection");
frame.add(panel1);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public TableSelection(JTable... tables) {
for (JTable table : tables) {
table.getSelectionModel().addListSelectionListener(this);
}
this.tables = tables;
}
private JTable getTable(Object model) {
for (JTable table : tables) {
if (table.getSelectionModel() == model) {
return table;
}
}
return null;
}
private void changeSelection(JTable table, String rowKey) {
int col = table.convertColumnIndexToView(0);
for (int row = table.getRowCount(); --row >= 0;) {
if (rowKey.equals(table.getValueAt(row, col))) {
table.changeSelection(row, col, false, false);
return;
}
}
table.clearSelection();
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() || ignore) {
return;
}
ignore = true;
try {
JTable table = getTable(e.getSource());
int row = table.getSelectedRow();
String rowKey = table.getValueAt(row, table.convertColumnIndexToView(0)).toString();
for (JTable t : tables) {
if (t == table) {
continue;
}
changeSelection(t, rowKey);
JViewport viewport = (JViewport) t.getParent();
Rectangle rect = t.getCellRect(t.getSelectedRow(), 0, true);
Rectangle r2 = viewport.getVisibleRect();
t.scrollRectToVisible(new Rectangle(rect.x, rect.y, (int) r2.getWidth(), (int) r2.getHeight()));
System.out.println(new Rectangle(viewport.getExtentSize()).contains(rect));
}
} finally {
ignore = false;
}
}
public static void main(String[] args) {
TableSelection tableSelection = new TableSelection();
}
}
public void scrollToVisible(JTable table, int rowIndex, int vColIndex) {
table.scrollRectToVisible(table.getCellRect(rowIndex, vColIndex, true));
}
public void scrollToVisible(final JTable table, final int rowIndex, final int vColIndex) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
table.scrollRectToVisible(table.getCellRect(rowIndex, vColIndex, false));
}
});
}