JPanel in JScollPane in einem JPanel

Liebes liebes Forum, hilf mir bitte… ich drehe langsam am Rad!
Ich möchte eine JPanel bzw. JScrollPane Komponente schreiben die wieder später mal einen Kalender beinhalten soll.

Nun verzweifle ich aber aber an dieser sch…önen JScrollPane.
Es soll drauf hinaus laufen, das in der JScrollPane sich später ein Kalender darstellt den man nach unten Scrollen kann.
Nur meine Versuche mit einem einfach mal eingefärbtem JPanel in dieser JScrollPane funktionieren schon nicht.
Wenn ich meine CalendarPane in NetBeans in das Form ziehe scheint noch alles gut auszusehen, nur wenn ich das dann starte stimmt zwar die Größe des Pane aber es sind keine Scrollbalken vorhanden.

Hier mal ein wenig code:

public class MyCalendarPane extends JPanel
{
    private JPanel _oPanel;
    private JScrollPane _oScroll;
    
    public MyCalendarPane()
    {
        JPanel oPnl = new JPanel();
        oPnl.setPreferredSize( new Dimension( 700, 700) );
        oPnl.setOpaque(true);
        oPnl.setBackground( Color.RED );
        
        this._oScroll = new JScrollPane( oPnl );
	this._oScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
	this._oScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
       
	this._oPanel = new JPanel();
	this._oPanel.setBounds(0, 0, 500, 300);
	this._oPanel.setVisible(true);
	this._oPanel.add(this._oScroll);

        this.add(this._oPanel);
    }
    ....
@Override
    public void setSize(Dimension d)
    {
        super.setSize(d);
        this._oScroll.setPreferredSize( d );
        this._oScroll.setSize(d);
        this._oPanel.setPreferredSize( d );
        this._oPanel.setSize(d);
    }
    
    @Override
    public void setSize( int iWidth, int iHeight )
    {
        super.setSize( iWidth, iHeight );
        this._oScroll.setPreferredSize( new Dimension( iWidth - 30 , iHeight - 30 ) );
        this._oScroll.setSize( iWidth - 30, iHeight - 30 );
//        this._oScroll.setBounds(0, 0, iWidth - 30, iHeight - 30);
        
        this._oPanel.setSize( iWidth, iHeight );
        this._oPanel.setBounds(0, 0, iWidth, iHeight);
    }
    
    
    @Override
    public void updateUI()
    {
        super.updateUI();
        if( this._oScroll != null )
        {
            this._oScroll.updateUI();
            this._oScroll.revalidate();
        }
        if( this._oPanel != null )
        {
            this._oPanel.updateUI();
        }
    }

Warum überschreibst Du updateUI, warum verhalten sich die zwei überschriebenen setSize Methoden unterschiedlich? Warum steckst Du (nur) ein Panel in ein Panel? Das kann man dann doch gleich weglassen. Ist Dir bewußt, dass JPanel standardmäßig FlowLayout verwendet? ( setBounds(0, 0, 500, 300); nutzt da nicht sonderlich viel) Warum enthält MyCalendarPane eine so verschachtelte Struktur und ein JScrollPane? Würde man dieses Panel nicht einfach in einem Container in eine JScrollPane verbauen, warum muss es eine JScrollPane mitbringen? Den Sinn dahinter habe ich noch nicht entdeckt.

Bei folgendem:

this._oScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
tis._oScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);```Kannst Du die Zeilen 2 & 3 weglassen, das ist default so eingestellt.

Allgemein: Ob die Scrollbars angezeigt werden, hängt ausschließlich (sofern grundsätzlich erlaubt) von der PreferredSize der Komponente im Viewport der ScrollPane ab.

ähnliche Fragen wie Michael hätte ich auch…hier mal ganz einfach ohne viel SchnickSchnack ein JSP Bsp.

		JFrame f = new JFrame();
		f.setSize(400, 400);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLocationRelativeTo(null);
		JPanel p = new JPanel();
		p.setBackground(Color.RED);
		p.setPreferredSize(new Dimension(500, 500));
		JScrollPane jsp = new JScrollPane(p);
		f.add(jsp);
		f.setVisible(true);
	}```

er schreibt doch NetBeans… das hat standardmässig für alle Container das “FreeStyle” ausgewählt (GroupLayout)…

die JScrollPane ist standardmäßig auf “AS NEEDED” eingestellt, wenn das Frame also groß genug ist um das Pane anzuzeigen, sind keine Scrollbalken sichtbar (im laufenden Programm), im GUIBuilder sind diese natürlich vorhanden.

Wenn die immer sehen willst, musst setVertical|HorizontalScrollBarPolicy auf “ALWAYS” setzen.

Obwohl ich schon eine Weile mit Swing programmiere, kann ich mich spontan nicht erinnern, dass ich es mal in irgendeinem Zusammenhang für notwendig gehalten habe, setSize oder updateUI zu überschreiben. Wenn man nicht weiß, wie die implementiert sind, kommt beim Überschreiben der ersten mit sicherheit Mist raus, und … die letzte muss man bestenfalls überschreiben, wenn man irgendwelche LaF-Experimente (z.B. einen komplett grün-schwarzen FileChooser) machen will…

Also von GroupLayout steht da nix in dem geposteten Code…

Aus Unwissenheit?!

Weil dieser Code noch von versuchen stammt und ich feststellte das Netbeans auf setSize(int,int) zurück greift und ich daher setSize(Dimension) nicht weiter geschrieben habe.

Weil anstatt dem Panel das in das Scrollpane kommt, ein Modifiziertes LayeredPane nehmen werde das den Kalender darstellt.

Was ist daran nun bitte so verschachtelt?
Ich will einfach nur um meinen Kalender ein ScrollPane haben, weil ich diesen Kalender eventuell auf einem Form platzieren werde/muss auf dem vielleicht noch zwei bis drei Dinge mehr kommen.

Danke für das Beispiel, darüber bin ich auch schon gestolpert, allerdings wurde da der ScrollPane direkt im Frame verdrahtet.

So nun habe ich mittlerweile viel Code wieder rausgeworfen und von links nach rechts verschoben und nun sieht der Kalender im laufenden Programm so aus wie in Netbeans.
Allerdings muss ich nach dem Start des Programm noch einmal updateUi meines MyCalendarPane aufrufen, kann man das umgehen, bzw. wie bekomme ich die Komponente dazu sich nach dem Aufbau des Forum „selbst zu Aktualisieren“.
Meine überschriebene updateUi Methode habe ich wieder entfernt.

Soso, du wirfst aus “Unwissenheit” mit codezeilen um dich und hoffst die richtigen zu finden? Wenn dein Kalender ein JPanel ist das sauber Programmiert ist und seine preferred Size richtig berechnet braucht man da nicht mehr machen als.
JScrollPane scrollpane=new JScrollPane(meineKalenderKomponente);

Kein updateUI, keine überschriebenen Methoden von denen du nicht weisst was sie machen. Aber da muss man eben auch wissen wie man mit Layoutmanagern umgeht…

[QUOTE=bERt0r]Soso, du wirfst aus „Unwissenheit“ mit codezeilen um dich und hoffst die richtigen zu finden? Wenn dein Kalender ein JPanel ist das sauber Programmiert ist und seine preferred Size richtig berechnet braucht man da nicht mehr machen als.
[/QUOTE]

JA ich gebe es zu etwas nicht zu wissen! :slight_smile:
und
JA ich habe mir erlaubt, nach dem mein Programm das ich in einer Sprache schreiben muss mit der ich nicht 100%tig vertraut bin, zu versuchen was passiert wenn ich gewisse Code Zeilen anpasse.

Was hier an der Stelle scheinbar immer noch nicht verstanden wird ist…
Im Editor NetBeans sieht meine Komponente so aus wie ich es will.
Ich ziehe im Editor, meinen Kalender größer - super sieht aus klasse aus - nun kompiliere und starte ich das Programm und mein Kalender behält die Größe die ich als Default eingestellt habe bis ich ein updateUI auf die Komponente mache.

Was du anscheinend nicht verstehst ist dass der Netbeans GUI builder dir nur was bringt wenn du dich auch mit den Grundlagen von Swing auskennst. Du kannst soviel rumklicken wie du willst, da wird nichts sauberes draus. Poste ein KSKB ohne … mittendrin und sag uns was nicht so läuft wie du es dir vorstellst.

Übrigens, wenn du mit etwas nicht vertraut bist, ist es meist sinnvoller dich damit vertraut zu machen anstatt wahllos draufloszuprogrammieren. Mach ein Tutorial…

[QUOTE=bERt0r]Was du anscheinend nicht verstehst ist dass der Netbeans GUI builder dir nur was bringt wenn du dich auch mit den Grundlagen von Swing auskennst. Du kannst soviel rumklicken wie du willst, da wird nichts sauberes draus. Poste ein KSKB ohne … mittendrin und sag uns was nicht so läuft wie du es dir vorstellst.

Übrigens, wenn du mit etwas nicht vertraut bist, ist es meist sinnvoller dich damit vertraut zu machen anstatt wahllos draufloszuprogrammieren. Mach ein Tutorial…[/QUOTE]

Ganz ehrlich - ich habe weder die Zeit noch die Lust mich jetzt darüber zu unterhalten wie man sich in eine neue Sprache rein arbeitet.
Habe ich ein Tutorial gemacht - ja.
Habe ich ein Tutorial gefunden was das abhandelt was ich z.Z. zum experimentieren brauche - nein.
Habe ich nicht lange genug gesucht - mag sein, mangels Zeit.

Ich habe eben hier eben angefangen einen Roman zu schreiben, weil ich bei solchen Aussagen - gelinde gesagt - an die Decke springen könnte.
Es bringt mich auch nicht weiter Tutorials 1:1 abzuschreiben, man muss auch ein wenig “Experimentieren” weil sonst kann nichts neues entstehen.
Aber gut - lassen wir das - ich habe nun erst einmal ein Workaround.
Ich werde nun erst einmal für weiteres die Leute bei google bemühen.

In diesem Sinne, trotzdem danke an alle.

Ich bin nur so deutlich weil du in die gleiche Falle wie viele andere Anfänger tappst. Du glaubst mit dem GUI Builder schnell Ergebnisse zu erreichen, da kommt aber nix gescheites dabei raus. Vergiss den GUI Builder. Aus meiner Erfahrung mit Swing ist immer dann, wenn du beim Layouten partout nicht weiterkommst und schon zahllose „Hacks“ versucht hast die Lösung eigentlich ganz simpel. Guck dir nur mal unseren „Hack“ Experten Nixphoean :smiley:

Eine LayeredPane ist ein besonderer Fall, da die Komponente ohne Layoutmanager (null Layout) arbeitet. Bei solchen Komponenten muss man sich selbst darum kümmern, dass die korrekte PreferredSize berechnet bzw. zurückgegeben wird. Besonders wichtig beim JScrollPane, da diese davon abhängig die Scrollbars bestimmt.

Solche Information finde ich spitze und bin ich auch dankbar, es tut mir auch leid wenn ich vielleicht ein wenig Bockig wirke.
Mein Problem ist, nebst fehlender Erfahrung mit Java, die Zeit.
Es geht nicht darum ob ich mit diesem kleinen Kalender fertig werde, es darum das daraus bestimmte Entscheidungen resultieren.

Ob man jemand der nicht die aller größte Ahnung hat damit zu beauftragen ist nun was anderes :wink:
aber da wir bei uns alle ziemlich auf einem (niedrigen) Level bewegen ist das schon wieder relativ.

Egal wie - mich ärgerte nun nur das auf mein Problem nicht wirklich eingegangen wurde.
Die Information die du mir nun geben hast, ist sehr gut - hättest du das z.B. mir im ersten Post von dir schon gesagt - wäre unser Gespräch ein wenig anders verlaufen. :wink:

So wie ich das nun auch sehe, dank dem Post von _Michael - hätte ich vielleicht auch noch von dem LayerdPane erzählen sollen. :slight_smile:

Ich kann aber nur wieder ein Danke an alle sagen für die Hilfe!

Da gehst aber schon ziemlich schnell an die Decke, deine Infos sind übrigens bißl wage.
Du meinst du ziehst was in NetBeans groß und alles ist super, aber wenn das Programm startest, ist alles verwurstelt… sowas, da hast aber mehr gemacht als nur “ziehen” oder?

Was es mit den ScrollBars auf sich hat, habe ich bereits gesagt.

Was die Größe angeht… nun wie es ausschaut hast du mit NetBeans eine Swing JPanel Form gemacht, die zu vergrößern ist schön und gut. Nur muss das Teil irgendwo in ein JFrame oder JDialog rein und weil das wohl eine eigene Klasse ist, ist dem Teil diese “Größenveränderung” gar nicht bekannt. Neben deinem MyCalendarPane hast dann vermutlich auch irgendwo ein MyFrame und an der Stelle musst die Größe des Panels auslesen und das Frame entsprechend vergrößern. Ansonsten hat das Frame seine vordefinierte Größe und egal was reinhaust, das wird eben nicht ganz angezeigt, außer da ist nen ScrollPane dazwischen, dann könntest rumscrollen um alles anzuzeigen. Wie Bertor gesagt hat, einfach rumklicken ist nicht.

Ich war der Meinung das ich die Infos gegeben habe, die notwendig sind.
Und - ja ich gehe an die Decke wenn ich ein Frage stelle… in einem Forum und ich alles bekomme nur keine (für mich) brauchbare Antwort.

Das will ich doch hoffen das so etwas geht, ich will doch nicht in einer Tour das Rad neu erfinden zudem funktioniert es ja auch mit den Standart Komponenten.
Mein einziges Problem besteht zur Zeit nur noch darin das ich wenn das UI geladen ist, auf meine Kalender Komponente ein updateUI machen muss.

updateUI ist eine Methode die normalerweise nur Swing “intern” aufgerufen wird und etwas mit dem Look And Feel zu tun hat. Wenn Du die Methode aufrufst um die Darstellung in korrekter Größe zu erreichen ist evtl. etwas im argen.
Spätenstens jetzt wäre es hilfreich, wenn Du ein kurzes kompilierbares Beispiel posten könntest mit dem wir hier das Problem nachvollziehen können. Ausser bei einem LookAndFeelHack kann ich mich nicht erinnern jemals updateUI benötigt zu haben. Auch Probleme von JLayeredPane mit JScrollPane kann ich nicht nachvollziehen - außer es wird wie bereits erwähnt die PreferredSize der Pane falsch berechnet.

Wenn ein Modelflugzeug zusammenklebst heisst noch lange nicht, dass es auch fliegt.

Das gilt auch für einen GUI Builder, nur weil etwas zusammenklickst heisst noch lange nicht, dass es am Ende läuft.

Auf meine Aussage gehst du gar nicht ein, hoffe mal in die andere Richtung.

Wenn du in NetBeans eine swing JFrame Klasse erstellst, in die ein JPanel schiebst und in dieses ein paar JButtons oder KomponenteX, dann funktioniert auch alles, wenn dann im Code z.B. die Schriftgröße für alle Komponenten änderst, werden die Komponenten automatisch vergrössert, damit das Panel und damit das Frame, ohne das was machen musst.
Wenn das nicht passiert, was ja wohl der Fall ist bei dir, dann hast du mehr gemacht als nur bloß “reinzuklicken”.

  1. wieso deine ScrollBars im GUI Builder sichtbar sind, zur Laufzeit aber nicht, habe ich im ersten Beitrag gesagt. Ob das nun endlich läuft oder nicht hast immernoch nicht gesagt.

  2. NetBeans hat gar keine Calendar Komponente, wenn du eine hast, dann musst du schon sagen welche und woher.

  3. Wenn du mit deinem Kalender aber eine eigene Klasse, die ein JPanel ist, meinst, in der x Buttons und sonstwas und auch die ganze Logik , dann steht die Lösung auch schon da. Zu glauben NetBeans kann alles für dich machen und du brauchst nur bißl rumklicken ist falsch gedacht.

Das ganze erinnert mich stark an Nixphoe, pampig und starker Unwillen was selbstständig zu machen. Das Forum ist da um dir bei Problemen behilflich zu sein, nicht um deine Probleme zu lösen, dafür kannst ruhig in die Jobbörse gehen. Poste deinen Code, dann kann man evtl nachvollziehen was gemacht hast, bei den Infos die gegeben hast, wurde schon alles gesagt.