AWT Scrollbars in dynamischem JPanel?

  • Themenstarter Themenstarter ViktorW
  • Beginndatum Beginndatum
V

ViktorW

Gast
Hallo,

Mein GUI für die laufende Sitzung eines Java Chats benutzt ein "null" Layout, welches ich wie folgt setze:

Java:
  // Create the backgound
  PanelBackground sessionBackground = new PanelBackground(new ImageIcon(...).getImage());
  sessionBackground.setBorder(BorderFactory.createEmptyBorder());
  sessionBackground.setLayout(null);
        
  // Add the background
  getContentPane().add(sessionBackground, BorderLayout.CENTER);

Diesem Panel werden alle weiteren Elemente über eine gesonderte Methode hinzugefügt:

Java:
  // Add other components
  addComponentsToPane(sessionBackground);

Innerhalb der addComponentsToPane Methode wird unter anderem ein weiteres JPanel für die Ausgabe des Nachrichenverlaufs erzeugt:

Java:
  Insets insets = pane.getInsets();

  // Chat screen field
  chatScreenArea = new JPanel();
  chatScreenArea.setLayout(new BoxLayout(chatScreenArea, BoxLayout.Y_AXIS));
  Dimension size = chatScreenArea.getPreferredSize();
  chatScreenArea.setOpaque(true);
  chatScreenArea.setBorder(BorderFactory.createEmptyBorder());
  chatScreenArea.setBounds(15 + insets.left,
                                13 + insets.top,
                               706 + size.width,
                               395 + size.height);
  pane.add(chatScreenArea);

Vom ClientController aus wird nun jede Chat Nachricht, als neues JLabel, dem chatScreenArea Panel hinzugefügt:
Java:
  // Post message
  JLabel chatLine = new JLabel(date + message);
  chatScreen.getChatScreenArea().add(chatLine);
  chatScreen.pack();

Das Ganze funktioniert soweit auch wunderbar, bloß ist besagte chatScreenArea irgendwann voll und alle weiteren chatLine Labels verschwinden unterhalb des Anzeigebereichs.
Ich möchte gerne ein JScrollPane hinzufügen um die Nachrichtenanzeige durch Scrollbars zu verlängern.

Mein Ansatz besteht bislang darin, das JScrollPane eine Ebene vor dem chatScreenArea-Panel zu erzeugen, auf der exakt selben Position, mit identischen Maßen und die chatArea über dieses neue Panel zu adden:

Java:
  JScrollPane scrollPane = new JScrollPane(chatScreenArea);
  Dimension size = scrollPane.getPreferredSize();
  scrollPane.setBounds(15 + insets.left,
                       13 + insets.top,
                      706 + size.width,
                      395 + size.height);

  ...
  chatScreenArea erzeugen
  ...

  scrollPane.add(chatScreenArea);
  pane.add(scrollPane);

Das Ganze funktioniert nun leider nicht so, wie ich es mit vorstelle.
Besagtes JScrollPane wird zwar hinter dem ursprünglichen chatScreenArea-Panel erzeugt, ist jedoch weder scrollbar, noch können weiterhin JLabels auf der chatScreenArea erstellt werden.
Unter anderem bekomme ich jede Menge Exceptions, welche aber wohl auf das BoxLayout der chatScreenArea zurück zu führen sind..

Ich gebe zu, die Funktionsweise des JScrollPanels noch nicht so recht verstanden zu haben.. kann mir jemand sagen, was ich falsch mache?

Danke.
 
Grundsätzlich:
null Layout: unschön
immer wieder neue JLabels als Zeile anhängen: unschön
;-)

Zu Deinem Problem, ich denke, das hierin die Ursache Deines Problems liegt:
Unter anderem bekomme ich jede Menge Exceptions, welche aber wohl auf das BoxLayout der chatScreenArea zurück zu führen sind...
Bei der ScrollPane hängt die Darstellung der Scrollbars von der PreferredSize der "inneren" Komponente ab. Scheinbar hat die chatScreenArea bzw. dessen Layout irgendwelche Probleme (beim Hinzufügen neuer Labels?) wodurch vermutlich die Berechnung der PreferredSize fehlschlägt/ausfällt und somit die Scrollbars der Pane nicht bzw. nicht korrekt dargestellt werden.
 
Nun, sie hat erst ein Problem, sobald die chatScreenArea dem JScrollPanel geadded wird, benutze ich stattdessen pane.add(chatScreenArea) ohne das JScrollLabel hinzuzufügen, funktioniert das Verfahren einwandfrei.
 
Okay, keine Fehler mehr aber

[Java]
Insets insets = pane.getInsets();

// Chat screen field
chatScreenArea = new JPanel();
chatScreenArea.setLayout(new BoxLayout(chatScreenArea, BoxLayout.Y_AXIS));
Dimension size = chatScreenArea.getPreferredSize();
chatScreenArea.setOpaque(true);
chatScreenArea.setBorder(BorderFactory.createEmptyBorder());
chatScreenArea.setBounds(15 + insets.left,
13 + insets.top,
706 + size.width,
395 + size.height);

JScrollPane scrollPane = new JScrollPane(chatScreenArea);
pane.add(scrollPane);
[/code]

Hat genau 0 Auswirkung!
Ich sehe keine Nachrichten, kein Panel, nichts!
 
Okay, Problem gelöst.
Das JScrollPane ist in keinster Hinsicht kompatibel mit dem "null" Layout, selbst wenn dies lediglich in einem der übergeordneten Panels gesetzt ist.
 

Zurück
Oben