MrSchmidtdtdtdt: Dynamisches JPanel mit JScrollBar versehen?

Guten Abend,

ich benutze ein JPanel ohne Layout mit absoluten Positionsangaben, welches wiederrum ein JPanel im BoxLayout enthällt, welches als Verlaufsausgabe eines Chats dient.
Die einzelnen Nachrichten werden als zur Laufzeit erzeugte JLabels dem JPanel mit BoxLayout hinzugefügt.
Nun ist irgendwann kein Platz mehr für neue Zeilen und alle weiteren JLabels verschwinden unterhalb des sichtbaren JLabel Bereichs.
Diesen möchte ich nun gerne mit einer Scrollbar versehen und bin bislang nicht in der Lage dieses Vorhaben zu realisieren.

Wie weiße ich einer JScrollBar den künftig "scrollbaren" Bereich im JPanel zu?

Vielen Dank.

  1. Hi,

    ich benutze ein JPanel ohne Layout mit absoluten Positionsangaben, welches wiederrum ein JPanel im BoxLayout enthällt, welches als Verlaufsausgabe eines Chats dient.
    Die einzelnen Nachrichten werden als zur Laufzeit erzeugte JLabels dem JPanel mit BoxLayout hinzugefügt.
    Nun ist irgendwann kein Platz mehr für neue Zeilen und alle weiteren JLabels verschwinden unterhalb des sichtbaren JLabel Bereichs.
    Diesen möchte ich nun gerne mit einer Scrollbar versehen und bin bislang nicht in der Lage dieses Vorhaben zu realisieren.

    Wie weiße ich einer JScrollBar den künftig "scrollbaren" Bereich im JPanel zu?

    "Üblich" wäre es, ein JScrollPane zu verwenden, in das das zu scrollende JPanel reinkommt.

    Ich finde aber auch den Ansatz mit den JLabels etwas ungewöhnlich.
    Was spricht gegen die Verwendung _einer_ JTextPane, an deren Text die neuen Zeilen jeweils angehängt werden?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hi

      "Üblich" wäre es, ein JScrollPane zu verwenden, in das das zu scrollende JPanel reinkommt.

      Also in etwa so?

      void addToPane(Container pane) {
        ...
        JScrollPane scrollPane = new JScrollPane(chatScreenArea);
        chatScreenArea.add(scrollPane);
        pane.add(chatScreenArea);
      }

      Muss ich nun auch eine gesonderte JScrollBar hinzufügen oder ist diese im JScrollPane bereits enthalten?
      Wenn ja, wie wird diese dem scrollPane zugewiesen?

      Ich finde aber auch den Ansatz mit den JLabels etwas ungewöhnlich.
      Was spricht gegen die Verwendung _einer_ JTextPane, an deren Text die neuen Zeilen jeweils angehängt werden?

      Ich habe bislang keine Möglichkeit gefunden einzelne Elemente wie beispielsweise Username, Timestamp usw. unabhängig voneinander, innerhalb eines JTextPane zu formatieren. Vermutlich ist es auch gar nicht möglich.
      Außerdem gestalltet sich die Übergabe zwischen den Clients sehr unsauber. (Große, mehrzeilige Strings..)

      1. Hi,

        void addToPane(Container pane) {
          ...
          JScrollPane scrollPane = new JScrollPane(chatScreenArea);
          chatScreenArea.add(scrollPane);
          pane.add(chatScreenArea);
        }

        When chatScreenArea das JPanel ist, das scrollbar sein soll: nein.

        Das zu scrollende Element (chatScreenArea) wird IN das JScrollPane eingesetzt.

        Muss ich nun auch eine gesonderte JScrollBar hinzufügen oder ist diese im JScrollPane bereits enthalten?

        Natürlich hat das ScrollPane bereits Scrollbars, sonst wär es ja kein ScrollPane.

        Ich habe bislang keine Möglichkeit gefunden einzelne Elemente wie beispielsweise Username, Timestamp usw. unabhängig voneinander, innerhalb eines JTextPane zu formatieren. Vermutlich ist es auch gar nicht möglich.

        Du hast nur nicht richtig gesucht.

        import javax.swing.JTextPane;
        import javax.swing.text.Style;
        import javax.swing.text.StyleConstants;
        import javax.swing.text.StyledDocument;

        //...
        private Style red;
        private JTextPane textPane;
        //...
        red = textPane.addStyle("Red", null);
        StyleConstants.setForeground(red, Color.RED);
        //...
        StyledDocument doc =  textPane.getStyledDocument();
        doc.insertString(doc.getLength(), "roter Text", red);
        doc.insertString(doc.getLength(), "Text in Default-Farbe", null);

        Außerdem gestalltet sich die Übergabe zwischen den Clients sehr unsauber. (Große, mehrzeilige Strings..)

        Wieso sollten nur wegen der Verwendung von JTextPane plötzlich mehrzeilige Strings übergeben werden?
        Man kann ja schließlich Text zum JTextPane hinzufügen.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hi

          Das zu scrollende Element (chatScreenArea) wird IN das JScrollPane eingesetzt.

          Welchem Panel adde ich dann meine JLabels?

          1. Welchem Panel adde ich dann meine JLabels?

            Blöde Frage.. natürlich der chatScreenArea und nicht dem ScrollPane..
            Aber irgendwie funktioniert das vorn und hinten nicht, mein JScrollPane richtet sich an einem völlig anderen Objekt aus (User Eingabezeile), was ich absolut nicht verstehen kann, da es nichts damit zutun hat und scheint leer zu sein.