JPanel passt die Größe nicht an

didi577

Bekanntes Mitglied
Hi,

ich habe ein kleines nJPanel (pnlLand), Auf diesem Habe ich eine Tabelle (scrollLand) mit zwei Zeilen gesetzt. Das JPanel passt sich aber nocht der Größe der Tabelle an. Ich habe u.a. folgende Einstellung probiert:
Java:
pnlLand.setPreferredSize(scrollLand.getPreferredSize());

das kommt raus:
upload_2017-1-3_9-9-3.png

Was muss ich tun damit die Tabelle in voller Größe im JPanel angezeigt wird?
 
Hast du schon versucht deinem Jpanel, auf dem die jtable liegt, ein borderlayout o.ä. als Layout zu geben?
Das sollte die Tabelle/das scrollPane eigentlich zwingen sich über die gesamte Breite zu verteilen.

Gruß
Robert
 
Hier mal ein kleines Beispiel welches die Tabelle auf die gesamte Größe des JPanels streckt:


Java:
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500, 500);
          
            String[][] d = { {"Bla", "A"}, {"Bla2", "B"} };
            String[] a = { "1", "2" };
          
            JTable t = new JTable(d, a);
            JPanel p = new JPanel();
          
            p.setLayout(new BorderLayout());
            p.add(t);
          
            f.add(p);
            f.setVisible(true);

(sorry für die schlechte Variablenbezeichnung - musste schnell gehen 😀 )

Gruß
Robert
 
Das liegt daran, weil die Tabelle "alleine" auf der Komponente sitzt.

Wie du in der API lesen kannst:

"Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately."

Entweder holst du dir also direkt den Header der Table und machst ihn sichtbar, oder du fügst einfach noch eine ScrollPane hinzu 🙂

Hier noch mal das Beispiel mit dem ScrollPane:
Java:
public static void main(String[] args)
{
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(500, 500);

    String[][] d = { {"Bla", "A"}, {"Bla2", "I"} };
    String[] a = { "1", "2" };

    JTable t = new JTable(d, a);
    JPanel p = new JPanel();
    JScrollPane sp = new JScrollPane(t);

    p.setLayout(new BorderLayout());
    p.add(sp);

    f.add(p);
    f.setVisible(true);
}
~quick'n'dirty

Gruß Robert
 
@Robat
so habe ich es:
Java:
String [][] daten = new String [][] {{"kA","bb","bw","sh","by","ni","nw","mv","rp","sn","st","th"}};
       String [] laender = new String [] {"kA","BB","BW","SH","BY","NI","NW","MV","RP","SN","ST","TH"};
       tblmLand = new DefaultTableModel(daten, laender);
       tblLand = new JTable(tblmLand);
       scrollLand = new JScrollPane(tblLand);
       
       scrollLand.getPreferredSize();
 
Ich weiß noch nicht so genau warum du immer versuchst die PreferredSize zu setzen.
Das regelt das Layout für dich. (deswegen würde ich dir auch das BorderLayout empfehlen).
 
habe jetzt alle Preferred Angaben auskommentiert, dem Panel das Border Layout zugefügt und bekomme das;
upload_2017-1-3_11-28-46.png

die Tabelle ist schon mal sichtbar 😉
 
nö ich erwarte das
upload_2017-1-3_11-47-13.png
nur mit vollständiger Tabelle zwischen der ersten und zweiten Zeile
ich muss dazu sagen dass das Panel pnlLand noch auf einem anderen Panel sitzt
das andere Panel hat ein Grid Layout
Java:
pnlAuswerten.setLayout(new GridLayout(0,1,5,1));
wenn ich hiern
Java:
pnlAuswerten.setPreferredSize(getPreferredSize());
auskommentiere ist dieses verzerrte Bild

Auf dem Panel pnlAuswerten sitzen mehrere JLabel und JTabel untereinander
 
@Robat
erstmal Sorry wegen dem Durcheinander, ich habe jetzt umgebaut und schon ein besseres Ergebnis:
auf dem Panel pnlAuswerten sitzen dann die Panel mit den Tabellen und die Label mit den Fragen untereinander. Nach jedem Label soll eine Table erscheinen. Das sieht jetzt so aus (ich habe erst eine Tabelle gebaut).
upload_2017-1-3_12-38-23.png
das einzige was jetzt noch stört ist der große Leerraum zwischen der Tabelle und "A.Fragen zum Dozenten"
Ich vermute ich muss für die Tabelle scrollLand noch irgendetwas einstellen?
 
Ändert sich die Größe / der Inhalt deiner Tabelle denn?
Wenn nicht dann musst du ja auch kein ScrollPane implementieren, was die ganze Geschichte deutlich vereinfachen würde.
Dann müsstes du einfach nur den TableHeader und danach die Table adden um das zu erreichen.

Java:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);

JPanel wrapper = new JPanel();
wrapper.setLayout(new BoxLayout(wrapper, BoxLayout.PAGE_AXIS));

JLabel lblHead = new JLabel("Davor");
JLabel lblSub   = new JLabel("Danach");

String[] col = {"Name", "Anzahl"};

Object[][] data = { {"Brot", 20"}, {"Apfel", 6}, {"Käse", 3} };

JTable table = new JTable(new DefaultTableModel(data, col));

wrapper.add(lblHead);
wrapper.add(table.getTableHeader());
wrapper.add(table);
wrapper.add(lblSub);

frame.add(wrapper),
frame.pack();
frame.setVisible(true);

Gruß Robert
 
Wenn nicht dann musst du ja auch kein ScrollPane implementieren, was die ganze Geschichte deutlich vereinfachen würde.
Dann müsstes du einfach nur den TableHeader und danach die Table adden um das zu erreichen.
Aha. Wenn ich mich zwei zwei Komponenten (header und table) rumschlagen muss anstatt nur mit einer (JScrollPane), vereinfacht sich das ganze?
@TE:
auf dem Panel pnlAuswerten sitzen dann die Panel mit den Tabellen und die Label mit den Fragen untereinander. Nach jedem Label soll eine Table erscheinen. Das sieht jetzt so aus (ich habe erst eine Tabelle gebaut).
Das habe och nicht ganz verstanden. Der Screenshot sieht so aus, als hättest du ein GridLayout, wobei eine Zelle mit der JTable bzw. der JScrollPane belegt ist, die andere mit einem weiteren JPanel, welches die JLabels enthält. Ist diese Vermutung richtig?
 
Hallo,

die getTableHeader Variante gefällt mir gut. Vielen Dank. Ich habe jetzt noch eine Panel Ebene entfernt und packe Label und Tables auf ein Panel mit Box Layout PAGE AXIS...Danke für die Hilfe
Jetzt müssen auf dem Panel nur noch irgendwie die Labels linksbündig werden? Wie geht das am besten?
upload_2017-1-3_18-58-29.png
 

Zurück
Oben