JTable neue Zeile springen?!

ElJarno

Mitglied
Hi Leute,
würde gerne den Focus auf neue angehängte Zeilen setzen. Also wenn ich eine neue Zeile einfüge, dass die ScrollPane dort hin scrollt falls diese nicht sichtbar ist. Hab auch was gefunden jedoch funktioniert das nicht richtig, weil immer nur in die vorletzte Zeile gesprungen wird:

Code:
        getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                scrollRectToVisible(getCellRect(e.getLastRow(), 0, false));
            }
        });

Gruß Jan
 
Hallo,

versuch doch's mal so:

Java:
JTable table = new JTable();
table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true);
//scrollt zur letzten Reihe von table (-1 aufgrund des Beginns mit 0 in der JTable)

Gruß,
Martin
 
Moin!
Das Problem ist, an der Stelle an der du scrollRectToVisible() aufrufst, ist die Tabelle noch im Aufbau. Anders gesagt, die Tabelle hat zu diesem Zeitpunkt die neue Zeile noch nicht visuell hinzugefügt, und daher schlägt der Sprung in die letzte Zeiel fehl. Abhilfe schafft ein Aufruf über invokeLater.

Beispiel:
Code:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

public class ScrollTableTestFrame extends JFrame {

    private JButton button;
    private JScrollPane scrollPanel;
    private JTable table;

    public ScrollTableTestFrame() {
        init();
    }

    private void init() {
        scrollPanel = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        button = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        String[] header = new String[]{
            "Title 1", "Title 2", "Title 3", "Title 4"
        };
        Object[][] data = new Object[50][4];
        for (int i = 0; i < 50; i++) {
            data[i] = new Object[]{"Column1-Row" + i, "Column2-Row" + i, "Column3-Row" + i, "Column4-Row" + i};
        }
        table.setModel(new DefaultTableModel(data, header));
        scrollPanel.setViewportView(table);

        button.setText("addRow");
        button.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addRow();
            }
        });

        ((DefaultTableModel) (table.getModel())).addTableModelListener(new TableModelListener() {

            public void tableChanged(TableModelEvent e) {
                SwingUtilities.invokeLater(new Runnable() {

                    public void run() {
                        table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
                    }
                });
            }
        });

        this.setLayout(new BorderLayout());
        this.add(button, BorderLayout.NORTH);
        this.add(scrollPanel, BorderLayout.CENTER);
        setVisible(true);
        pack();
    }

    private void addRow() {
        Object[] row = {"new Row", "new Row", "new Row", "new Row"};
        ((DefaultTableModel) (table.getModel())).addRow(row);
    }

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

*grüssle*
 
Zuletzt bearbeitet:
Zurück