Swing JScrollBar wird nicht eingeblendet, wenn JTable befüllt wird

xehpuk

Top Contributor
Hallo!

Ich habe eine JTable, welche in einem JScrollPane liegt. Wird die Tabelle nun so mit Daten befüllt, dass sie zu hoch wird, um komplett angezeigt zu werden, so sollte eine JScrollBar erscheinen.
Diese tuts aber nicht sofort, sondern erst, wenn ich die Größe des JFrame verändere. Hier ein kurzer Beispielcode:
Java:
public class JTableExample extends JTable {
	private final List<Integer> data;
	private int count = 0;
	
	public JTableExample() {
		this.data = new ArrayList<Integer>();
		setModel(new AbstractTableModel() {
			private final String[] columnNames = {"Zahlen"};
			
			@Override
			public int getRowCount() {
				return data.size();
			}
			
			@Override
			public String getColumnName(int column) {
				return columnNames[column];
			}
			
			@Override
			public int getColumnCount() {
				return columnNames.length;
			}
			
			@Override
			public Object getValueAt(int rowIndex, int columnIndex) {
				return data.get(rowIndex);
			}
		});
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.getContentPane().setLayout(new BorderLayout());
		final JTableExample table = new JTableExample();
		final JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		table.setFillsViewportHeight(true);
		pane.setPreferredSize(new Dimension(100, 100));
		frame.add(pane, BorderLayout.CENTER);
		JButton button = new JButton("Klick!");
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				table.data.add(table.count++);
				table.repaint();
			}
		});
		frame.add(button, BorderLayout.NORTH);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
Habe schon wie wild mit validate() und repaint() auf alle möglichen Komponenten rumprobiert, jedoch ohne Erfolg. Konnte bisher auch nichts zu dem Thema finden. Ist wahrscheinlich auch nur eine kleine Sache. Was fehlt denn?
 
repaint() bringt wenig, die Table zeigt dann nur ihren aktuellen Stand, schaut nicht nach neuen Daten im Model

mit ein bisschen Grundkenntnissen zu Table + Model (auch nur EIN winziges Beispiel zur eigenen Implementation vorher anschauen..)
müsste man von den fireXy-Methoden gehört haben, die die Tabelle über Änderungen informiert

z.B. an die Stelle des repaint()s
[c]((AbstractTableModel)table.getModel()).fireTableDataChanged();[/c]
 
Hallo,

anstatt
Java:
table.repaint();

benutze

Java:
((AbstractTableModel)table.getModel()).fireTableDataChanged();

Daraufhin sollte die ganz Tabelle neu gezeichnet werden.

Grüße Holgi
 
Ich hatte kurz von den TableModelEvents gelesen, dachte aber, dass die für höhere Zwecke geeignet wären. Ich werde das Thema demnächst auch genauer studieren, wollte mich aber gerade nicht dran aufhängen, weil andere Dinge des betroffenen Projekts wichtiger sind. 😉

Wie dem auch sei: Code funktioniert, vielen Dank!
 

Zurück
Oben