Swing Problem beim Scrollen mit JScrollPane

Nemesys88

Bekanntes Mitglied
Hallo!

Ich möchte beim Hinzufügen eines Eintrags in meine Tabelle gerne den Scrollbalken (vertikal) nach ganz unten setzen.

Habe das mit folgender Codezeile versucht:

Java:
tabelle_werkzeug.getVerticalScrollBar().setValue(tabelle_werkzeug.getVerticalScrollBar().getMaximum());

Bekanntes Problem: getMaximum bekommt die "neue Länge" quasi erst zu spät mit... Resultat: er scrollt nur bis zum vorletzten Eintrag.

Jetzt hab ich nach Lösungen gesucht. Die einzige, die funktioniert hat ist die hier:

Java:
        tabelle_werkzeug.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener()
        {
            public void adjustmentValueChanged(AdjustmentEvent e)
            {
                tabelle_werkzeug.getVerticalScrollBar().setValue(tabelle_werkzeug.getVerticalScrollBar().getMaximum());
            }
        });

Leider funktioniert die nicht so wie gewünscht... zwar scrollt er jetzt automatisch bis nach ganz unten allerdings kann man jetzt garnicht mehr hochscrollen (er springt dann wieder nach unten wenn man die Maus loslässt). Ausserdem hat er beim Löschen eines Eintrages dann eine "NoSuchEntry"-Exception oder so geworfen...

Gibt es eventuell eine bessere Möglichkeit, den Scrollbalken nach unten (an's Maximum) zu setzen?

P.s.: tabelle_werkzeug ist meine JScrollPane

mfG
 
Ich hab diesen Code bei StackOverflow gefunden:

Der Adjust Listener reagiert offenbar schon bei jedem Scrollen. Also würde ich stattdessen an der Stelle wo das Model verändert wird folgendes versuchen

Java:
int height = (int)table.getPreferredSize().getHeight();
Rectangle rect = new Rectangle(0, height, 10, 10);
table.scrollRectToVisible(rect);
 
Zuletzt bearbeitet von einem Moderator:
Hier mal ein kleines Beispiel mit Zufallsdaten in der Tabelle. Vielleicht hilft dir das ja.

Java:
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;


public class Start
{
    private static Random r = new Random();
   
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
           
            @Override
            public void run()
            {
                JFrame frame = new JFrame("Test Frame");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
                String[] header = new String[]{"Column 1", "Column 2"};
                int nRows = 100;
                final int nCols = header.length;
               
               
               
                String[][] content = createContent(nRows, nCols);
                final DefaultTableModel model = new DefaultTableModel(content, header);
               
               
                final JTable table = new JTable(model);
                JScrollPane scroll = new JScrollPane(table);
               
                JButton add = new JButton("Add");
                add.addActionListener(new ActionListener() {
                   
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {
                        model.addRow(createRow(nCols));
                       
                        int height = (int)table.getPreferredSize().getHeight();
                        Rectangle rect = new Rectangle(0, height, 10, 10);
                        table.scrollRectToVisible(rect);
                    }
                });
               
                frame.add(scroll, BorderLayout.CENTER);
                frame.add(add, BorderLayout.SOUTH);
               
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
   
    private static String[] createRow(int cols)
    {
        String[] row = new String[cols];
       
        for(int x = 0; x < cols; x++)
        {
            row[x] = createRandomData() + "|" + createRandomData();
        }
       
        return row;
    }
   
    private static String[][] createContent(int rows, int cols)
    {
        String[][] content = new String[rows][cols];
       
        for(int y = 0; y < rows; y++)
        {
            content[y] = createRow(cols);
        }
       
        return content;
    }
   
    private static String createRandomData()
    {
        return String.valueOf(r.nextInt(10));
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Super, es funktioniert! Vielen Dank! 🙂

Ich hatte nur versehentlich bei diesen 3 Zeilen

Java:
int height = (int)table.getPreferredSize().getHeight();
Rectangle rect = new Rectangle(0, height, 10, 10);
table.scrollRectToVisible(rect);

die table durch die JScrollPane ersetzt und nicht durch die Variable der JTable... 😀
 

Neue Themen


Zurück
Oben