JTable/JScrollPane repaint() Problem

Tsunamii

Mitglied
So jetz meld ich mich auch mal als Autor zu Wort

Hier ist meine momentane Situation:
Ich lass meine Panels dynamisch aus XML Dateien aufbauen, was bisher auch wunderbar funktioniert hat, nur wollte ich jetzt die Möglich hinzufügen, dass man JTables benutzen kann, die in einer JScrollPane liegen.

Momentan wird die JTable so eingebaut:
-> erzeugen des JPanels
-> setzen der Attribute
->-> erzeugen der JScrollPane
->-> setzen der Attribute
->-> hinzufügen der JScrollPane an das Panel
->->-> erzeugen der JTable
->->-> setzen der Attribute
->->-> hinzufügen der JTable an die Pane

Desweiteren soll die JTable leer erzeugt werden und nur die Header anzeigen, da die Table erst gefüllt wird, wenn der Benutzer auf Suchen klickt.

Mein eigentliches Problem ist nun folgendes:
- die Header Leiste wird gar nicht erst angezeigt
- die ScrollBar wird zwar angezeigt, wird aber übermalt sobald Einträge in die Table kommen
- scrollen ist gar nicht erst möglich


Hab mal versucht den Aufbau nicht dynamisch nachzubauen:
Code:
import java.awt.Dimension;

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

public class TableTest {
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		
		JScrollPane pane = new JScrollPane();
		
		pane.setPreferredSize(new Dimension(300,300));
		pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		JTable table = new JTable();
		for(int i=0; i<100; i++) {
			addEmptyRow(table);
		}
		
		table.setSize(300, 300);
		table.setPreferredSize(table.getSize());
		table.setVisible(true);
		
		pane.add(table);
		frame.getContentPane().add(pane);
		
		System.out.println(table.getRowCount());
		
		frame.setSize(500,500);
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	    frame.setLocationRelativeTo(null);
	}
	

	public static void addEmptyRow(JTable pTable) {
		DefaultTableModel tModel = (DefaultTableModel) pTable.getModel();
		tModel.addRow((Object[]) null);
		tModel.fireTableStructureChanged();
	}

}

Ich hoffe wirklich dass mir hier jemand helfen kann. Ich sitz hier schon einige Stunden dran und es ist keine Lösung in sicht.
 
Hi,

hier, so geht es bei mir.

Java:
import java.awt.Dimension;

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

public class TableTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame(); 

		DefaultTableModel model = new DefaultTableModel();
		model.setColumnIdentifiers(new String[]{"Test1", "Test2", "Test3"});
        
        JTable table = new JTable(model);
        for(int i=0; i<100; i++) {
            addEmptyRow(table);
        }
		
        table.setSize(300, 300);
        table.setPreferredSize(table.getSize());
        table.setVisible(true);

		JScrollPane pane = new JScrollPane(table);
		pane.setPreferredSize(new Dimension(300,300));
        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);		
        frame.getContentPane().add(pane);

        System.out.println(table.getRowCount());

        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }


    public static void addEmptyRow(JTable pTable) {
        DefaultTableModel tModel = (DefaultTableModel) pTable.getModel();
        tModel.addRow(new String[]{"1", "2", "3"});        
    }

}

Ansonsten kannst du auch, statt die Table im Constructor des ScrollPanes zu übergeben, sie mit
Java:
pane.setViewportView(table)
hinzufügen

Gruß
Der Wolf
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort, habe aber eine andere Lösung gefunden.
Und zwar habe ich mir eine eigene Klasse geschrieben die von JScrollPane erbt und bereits eine eigene Table beinhaltet. Dies hat den Hintergrund, dass ich jetz beim Erzeugen einer Table nicht mehr 2 sondern nur 1 Klasse per Hand erzeugen muss.

Hier mal der Code für die dies interessiert (Kann nützlich sein, da eine Table ja im Normalfall eh immer einen Scrollbalken hat):
Code:
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

import de.***.********.application.gui.jxl.JXLUtils;

public class ScrollTable extends JScrollPane {

	private static final long serialVersionUID = 1L;
	private static final ThisTable table = new ThisTable();

	public ScrollTable() {
		super(table);
		table.setVisible(true);
	}

	public void addColumn(String pTitle) {
		DefaultTableModel tModel = (DefaultTableModel) table.getModel();
		TableColumn tCol = new TableColumn(tModel.getColumnCount());
		tCol.setHeaderValue(pTitle);
		table.addColumn(tCol);
		tModel.addColumn(pTitle);
		tModel.fireTableStructureChanged();
	}

	public void addColumns(String... pTitles) {
		for (String tTitle : pTitles) {
			addColumn(tTitle);
		}
	}

	public void addColumns(String pTitles) {
		Object tOptions[] = pTitles.split("\\s*,\\s*");
		tOptions = JXLUtils.trim(tOptions);
		for (Object tObj : tOptions) {
			addColumn((String) tObj);
		}
	}

	public void addEmptyRow() {
		DefaultTableModel tModel = (DefaultTableModel) table.getModel();
		tModel.addRow((Object[]) null);
		tModel.fireTableStructureChanged();
	}
	
	public int getRowCount() {
		return table.getModel().getRowCount();
	}

	private static class ThisTable extends JTable {

		private static final long serialVersionUID = 1L;

		private ThisTable() {
			super();
			setVisible(true);
		}
	}
}
 
Zurück