PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] JScrollPane funktioniert mit TextArea nicht wie erwartet



daboss
17.08.2009, 10:26
Heyho,

ich wollte in Java eine kleine GUI erstellen. Darin soll sich auch ein JTabbedPane befinden. Die einzelnen Reiter/Tabs sind JScrollPanes, weil ich vorher nicht weiss, wie viel Inhalt da rein kommt. In das JScrollPane kommt dann das JPanel mit dem eigentlichen Inhalt. Enthält das JPanel jetzt mehr Inhalt, wie dargestellt werden kann, dann kann ich scrollen. Aber wenn ich Checkboxen und TextAreas hinzufüge, werden die von unten nach oben über das komplette Fenster gezogen, nicht nur über den Reiter. (Siehe Screenshot) JLabels und JTextFields verschwieden, wie ich's erwarte. Kann bitte jemand nen Tipp geben, was ich falsch mache, und wie's funktioniert? Danke schonmal.

Auszüge aus dem Code geb ich noch mit dazu. Hier erstelle ich das JTabbedPane und füge es später zum JFrame hinzu. (Das JFrame hat ein BorderLayout, das Pane kommt in die Mitte.) Ich hoffe, das ist einigermassen vollständig, ich hab's auf's wesentliche zusammenkürzen wollen:



JTabbedPane jtpQuestions;
JPanel jpTab;
JPanel jpTabContent;
JScrollPane jspTabContent;

GridLayout jpLayout = new GridLayout(1, 1);
jpLayout.setVgap(0);
jpLayout.setHgap(0);
jpTab.setLayout(jpLayout);

GridBagLayout gbl = new GridBagLayout();

for(/* lies, was ins Panel soll */){
jpTab = new JPanel();
jpTabContent = new JPanel();
jspTabContent = new JScrollPane();
jpLayout = new GridLayout(1, 1);
jpLayout.setVgap(10);
jpLayout.setHgap(10);
jpTab.setLayout(jpLayout);

jpTabContent.setLayout(gbl);

if(/* Textarea soll rein */){
JLabel jl = new JLabel(f.getINr() + ". " + f.getSInhalt());
jl.setName(String.valueOf(f.getINr()));
jl.setHorizontalAlignment(SwingConstants.RIGHT);

gbl.setConstraints(jl, this.getGridBagConstraints(0, y++, 1, 1, 0, 0));
jpTabContent.add(jl);

TextArea ta = new TextArea();
gbl.setConstraints(ta, this.getGridBagConstraints(1,
y++, 2, 1, 1.0, 0));

jpTabContent.add(ta);
} else if(/* Checkbox soll rein */){
Checkbox chk = new Checkbox();
chk.setLabel(c.getSInhalt());
chk.setName(String.valueOf(c.getINr()));

gbl.setConstraints(chk, this.getGridBagConstraints(
1, y++, 2, 1, 1.0, 0));
jpTabContent.add(chk);
} //...

jspTabContent.setViewportView(jpTabContent);
jpTab.add(jspTabContent);
jtpQuestions.addTab(sBereich, jpTab);

}

vatc.setJtpQuestions(jtpQuestions);


Hier noch die Funktion getGridBagConstraints:


private GridBagConstraints getGridBagConstraints(int x, int y, int width,
int height, double weightx, double weighty) {

GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.weightx = weightx;
gbc.weighty = weighty;
return gbc;
}

juan_
17.08.2009, 13:11
ohne dein Problem jetzt richtig verstanden zu haben.
Versuchs doch mal ohne Layoutmanager!

Dann musst du zwar das Fester statisch machen (also setRezisable = false, oder so), aber du bist wesentlich flexibler in der Gestaltung. Außerdem kann ein Objekt (bei einem Layoutmanager) afaik nur 3 weitere Objekte enthalten.

Ciao

daboss
18.08.2009, 08:20
Hey,

naja, vom Nulllayout bin ich nicht so wirlich überzeugt, bisher ;) Aber ich hab meinen Fehler eben selber gefunden: JTextArea (in einem eigenen JScrollPane und festgelegter Zeilenzahl) und JCheckBox / JRadioButton, und schon schaut's so aus, wie ich's eigentlich erwartet habe. Kommt davon, wenn man sich zusätzlich zu dunkelstem Halbwissen auf Eclispe-Automatismem verlässt...

(Um's ursprüngliche Problem zu verdeutlichen, hab ich die "richtige" Optik nochmal angehängt... Jetzt bleiben beim Scrollen die Checkboxen/Radiobuttons/Textareas im TabbedPane und scrollen nicht mehr übers komplette Fenster)

Trotzdem Danke für deine Antwort :)

der_Kay
31.01.2010, 12:35
Auf die Gefahr hin, dass das etwas pauschal daher kommt: Ich hatte bei einem Java-GUI- Projekt mit wechselnden Panel-Inhalten genau das gleiche massive Rumgenerve mit sich streckenden, nicht zentrierten Komponenten, etc.

Ich habe schließlich alles bestens mit dem NetBeans-Editor zusammenklicken können. Sparte viel zeit und Nerven... :-)