W
WeeN
Gast
Hallo, ich habe folgendes Problem:
Ich möchte Elemente, hier eigene JPanels, auf einem "Parent"-JPanel anordnen. Dieses Parent-JPanel soll innerhalb einer JScrollPane angezeigt werden und demzufolge auch bei einem zu großen Parent-JPanel scrollbar sein. Nun weiss ich nicht, ob das so funktioniert.
Ich habe im Forum gesucht, aber nichts wirklich passendes gefunden. Es gab scheinbar einen ähnlichen Threat, wo dann aber wegen angeblicher Trivialität auf die Sun-Tutorials zu JScrollPane verwiesen wurde.
Mir ist nach Durchlesen des Tutorials trotzdem noch einiges unklar:
- im Bezug auf mein Problem: muss ich ein eigenes JPanel ableiten, das Scrollable implementiert, da das Standard-JPanel dies nicht implementiert?(Das Sun-Tutorial nimmt ein abgeleitetes JLabel, weshalb ich meine Vermutung als bestätigt sehe, aber lieber nochmal nachfrage)
- was sagt "preferredSize" konkret aus? Muss ich keine Größenangaben mehr treffen, sondern setze nur noch die Position und preferredSize und das Element nimmt meine gewünschten Maße an?
- wie steht die preferredSize im Zusammenhang mit dem anzeigenden Element(der JScrollPane) und dem Client(in meinem Fall das Parent-JPanel)?
a) Muss ich, wenn ich dem JScrollPane eine feste Größe angegeben habe, aber noch keine preferredSize, die
preferredSize auf die aktuell Größe des JScollPane setzen?
b) Muss die preferredSize des Clients(hier das JPanel) die Gesamtgröße des JPanels sein oder nur der sichtbare
Ausschnitt ?
Zusätzlich zu dem Problem ist noch, das später die JPanels, die sich innerhalb des Parent-Panels befinden, durch Angabe einer Zahl entsprechend verändern sollen. Wird z.B. eine 5 angegeben, sollen 5 JPanels in dem Parent-JPanel erscheinen. Wird diese Anzahl erhöht oder verringert, ändert sich demzufolge auch die Größe des Parent-JPanels und der Scrollbereich der JScrollPane.
Mögliche Vorgehensweise:
Ich packe die JPanels standardmäßig in ein Array.
Bei einer Änderung verändere das Array entsprechend(Array umkopieren in ein neues Passendes), bei kleinerer Anzahl mache ich ein remove(), bei größerer ein add(), setze ev. vorher das Parent-JPanel auf die neue Größe.
Muss ich dan nur den revalidate()-Aufruf machen, oder gibt es noch mehr zu beachten?
Ich hoffe, das meine Absicht erkennbar ist und ich meine Probleme klar dargelegt habe. Im Folgenden noch ein Beispiel-Code, der das ganze etwas verdeutlichen soll.
[/code]
Ich möchte Elemente, hier eigene JPanels, auf einem "Parent"-JPanel anordnen. Dieses Parent-JPanel soll innerhalb einer JScrollPane angezeigt werden und demzufolge auch bei einem zu großen Parent-JPanel scrollbar sein. Nun weiss ich nicht, ob das so funktioniert.
Ich habe im Forum gesucht, aber nichts wirklich passendes gefunden. Es gab scheinbar einen ähnlichen Threat, wo dann aber wegen angeblicher Trivialität auf die Sun-Tutorials zu JScrollPane verwiesen wurde.
Mir ist nach Durchlesen des Tutorials trotzdem noch einiges unklar:
- im Bezug auf mein Problem: muss ich ein eigenes JPanel ableiten, das Scrollable implementiert, da das Standard-JPanel dies nicht implementiert?(Das Sun-Tutorial nimmt ein abgeleitetes JLabel, weshalb ich meine Vermutung als bestätigt sehe, aber lieber nochmal nachfrage)
- was sagt "preferredSize" konkret aus? Muss ich keine Größenangaben mehr treffen, sondern setze nur noch die Position und preferredSize und das Element nimmt meine gewünschten Maße an?
- wie steht die preferredSize im Zusammenhang mit dem anzeigenden Element(der JScrollPane) und dem Client(in meinem Fall das Parent-JPanel)?
a) Muss ich, wenn ich dem JScrollPane eine feste Größe angegeben habe, aber noch keine preferredSize, die
preferredSize auf die aktuell Größe des JScollPane setzen?
b) Muss die preferredSize des Clients(hier das JPanel) die Gesamtgröße des JPanels sein oder nur der sichtbare
Ausschnitt ?
Zusätzlich zu dem Problem ist noch, das später die JPanels, die sich innerhalb des Parent-Panels befinden, durch Angabe einer Zahl entsprechend verändern sollen. Wird z.B. eine 5 angegeben, sollen 5 JPanels in dem Parent-JPanel erscheinen. Wird diese Anzahl erhöht oder verringert, ändert sich demzufolge auch die Größe des Parent-JPanels und der Scrollbereich der JScrollPane.
Mögliche Vorgehensweise:
Ich packe die JPanels standardmäßig in ein Array.
Bei einer Änderung verändere das Array entsprechend(Array umkopieren in ein neues Passendes), bei kleinerer Anzahl mache ich ein remove(), bei größerer ein add(), setze ev. vorher das Parent-JPanel auf die neue Größe.
Muss ich dan nur den revalidate()-Aufruf machen, oder gibt es noch mehr zu beachten?
Ich hoffe, das meine Absicht erkennbar ist und ich meine Probleme klar dargelegt habe. Im Folgenden noch ein Beispiel-Code, der das ganze etwas verdeutlichen soll.
Code:
/**
* @author WeeN
*/
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class JScrollPaneEX extends JFrame{
public JScrollPaneEX() {
//*****************Grundlegende Fenstereigenschaften*******************
super("Testframe");
this.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event){
event.getWindow().setVisible(false);
event.getWindow().dispose();
System.exit(0);
}
});
this.setSize(500,400);
this.setResizable(false);
this.setLocation(200, 200);
//**********************Beginn Zusätzliches Zeug***********************
//Hauptcontainer
Container cp = getContentPane();
cp.setLayout(null);
//**********************Inneres Feld ohne Rand*************************
Dimension d = getSize();
d.height = d.height - getInsets().top - getInsets().bottom;
d.width = d.width - getInsets().left - getInsets().right;
//***********************Eigene Panels erzeugen************************
PersonalPanel[] pp = new PersonalPanel[3];
for(int i =0 ; i < pp.length; i++){
pp[i] = new PersonalPanel();
}
//********************Parent-Panel*************************************
JPanel jp = new JPanel(null);
//****************Eigene Panels zum Parent-Panel hinzufügen************
for(int i = 0; i < pp.length; i++){
jp.add(pp[i]);
pp[i].setLocation(10, 10 + (i * (pp[0].getHeight() + 10)) );
}
//****************************JScrollPane******************************
JScrollPane scrollPane = new JScrollPane(jp,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setSize(440,(int) (d.height / 4) * 2);
cp.add(scrollPane);
scrollPane.setLocation((int)(d.width - 440 ) / 2, (int)d.height / 4 );
scrollPane.getViewport().add(jp);
cp.invalidate();
cp.validate();
}
public static void main(String[] args){
JScrollPaneEX frame = new JScrollPaneEX();
frame.setVisible(true);
}
class PersonalPanel extends JPanel{
JLabel jLbl_Bezeichner;
JTextField jTxtFld_Bezeichner;
JLabel jLbl_Punkte;
JSpinner jSpin_Punkte;
JLabel jLbl_Auswahl;
JComboBox jCmbBx_Auswahl;
public PersonalPanel(){
//Initialisierung Grund-Panel
super(null);
JPanel me = this;
me.setSize(420, 80);
//Zur Kenntlichmachung des Panels mit Border versehen
me.setBorder(new LineBorder(new Color(34,12,45), 2));
//Bezeichnungslabel Initialisierung
jLbl_Bezeichner = new JLabel("Position");
jLbl_Bezeichner.setSize(100, 25);
me.add(jLbl_Bezeichner);
jLbl_Bezeichner.setLocation(10,10);
//Bezeichnungstextfeld Initialisierung
jTxtFld_Bezeichner = new JTextField();
jTxtFld_Bezeichner.setSize(170, 25);
me.add(jTxtFld_Bezeichner);
jTxtFld_Bezeichner.setLocation(115,10);
//Punktelabel Initialisierung
jLbl_Punkte = new JLabel("Punkte");
jLbl_Punkte.setSize(80, 25);
me.add(jLbl_Punkte);
jLbl_Punkte.setLocation(290,10);
//Punkte-Spinner Initialisierung
SpinnerNumberModel snm = new SpinnerNumberModel(1, 0, 20, 1);
jSpin_Punkte = new JSpinner(snm);
jSpin_Punkte.setSize(35, 25);
me.add(jSpin_Punkte);
jSpin_Punkte.setLocation(375,10);
//Dienstrang-Label Initialisierung
jLbl_Auswahl = new JLabel("Gruppe");
jLbl_Auswahl.setSize(100, 25);
me.add(jLbl_Auswahl);
jLbl_Auswahl.setLocation(10,45);
//Dienstrang-ComboBox Initialisierung
jCmbBx_Auswahl = new JComboBox();
jCmbBx_Auswahl.setSize(210, 25);
me.add(jCmbBx_Auswahl);
jCmbBx_Auswahl.setLocation(115,45);
}
}
}