Scrollbars unsichtbar bei vielen Einträgen

Hey.

Ich habe heute mal wieder mein aller erstes größeres Projekt ausgepackt: Es war ein Musikplayer, der auch funktioniert, nur sehr wenig mit OOP zu tun hat und auch vieles doppelt dasteht etc. Ein erstes Projekt halt. Allerdings ist er voll funktionsfähig, hat paar kleinere Bugs, aber funktioniert großteils und daher bin ich auch immernoch stolz darauf, das geschafft zu haben. Allerdings ist mir heute beim bisschen verbessert aufgefallen, sollten in der JList viele Einträge drin sein und das Fenster nicht maximiert (Ich denke mal bei maximiert wäre es das gleiche, habe nur nich so viele Dateien da, das es bei nem 4k monitor dazu kommt.) ist, das die Scrollbar rechts einfach unsichtbar wird.

Gibts ne Möglichkeit das zu verhindern? Ich meine, sie funktioniert immernoch problemlos, also das Scrollen. Aber ich sehe den Scrollbar ansich nicht mehr, bis ich das Fenster wieder etwas größer mache.

achte doch bitte auf die richtige Area für Frage, GUI hat eine eigene,
‘Grundlagen’ sind nur einfache Themen wie Kontrollstrukturen


zweimal schon gab es kürzlich ähnliches,
wenn der Bug mit Nimbus auch bei dir zutrifft dann gefunden
http://forum.byte-welt.net/java-forum/awt-swing-javafx-swt/17772-mit-der-scrollbar-bei-langen-texten-und-dem-nimbuslookandfeel.html

sonst aus so allgemeiner Beschreibung wohl nichts herauszulesen leider,
andererseits kann es reale Erklärungen/ Korrekturen für sowas eh kaum geben,
also wirklich nur die Frage ob wer ähnliches kennt

In meinem Fall (siehe Link) half es, das Jar dann mit einer niedrigereren Javaversion auszuführen. Ich hoffe, sie fixen das bald mal.

Ich denke eher, dass die nicht mehr viel Energie in Swing stecken werden, da irgendwann das JavaFX das ganze ablösen wird.

Versuch ggf. mal die always-visible-policy (siehe doc) - damit kann man ein JScrollPane dazu “zwingen” die ScrollBar dauerhaft anzuzeigen. Vllt. hilft es was.

Die Scrollbars werden ja angezeigt, aber der mittlere “Griff”, an dem man den Inhalt bewegen kann, wird dann einfach nicht mehr dargestellt.

Da sie das kaputt gemacht haben, sollten sie es auch reparieren.

Werden wir wohl damit leben müssen, aber so wie ich das mitgekriegt habe, sollte das doch schon vor 4 Updates gefixxt werden?

UIDefaults defaults = lookAndFeel.getDefaults();
defaults.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));```
Das nach dem setzten von Nimbus LaF hinzufügen und die Scrollbar verschwindet nicht mehr, da das die minimale Größe ist, die die Scrollbar erhalten wird und die grade noch im sichtbaren liegt. Bei kleineren Werten verschwindet sie wieder

Praktisch!

Hier ein Testprogramm zum rumspielen:


import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Dialog.ModalityType;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.LookAndFeel;
import javax.swing.UIDefaults;
import javax.swing.UIManager;

/**
 * In einem Projekt fehlen plötzlich die mittleren Anfasser der ScrollBar.
 * Den Unterschied sieht man, wenn man REPEAT von 100 auf 10 wechselt.
 */

public class MissingScrollBarElementsStandAlone {

    private static final int REPEAT = 100;
    private static final boolean LIMIT_MINIMUM_THUMB_SIZE = true;

    public static void main(String[] args) {
        setNiceLayoutManager(); // ohne wird er angezeigt!
        JDialog dialog = createDialog();
        dialog.setVisible(true);
    }

    public static void setNiceLayoutManager() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            /* Dies löst es vorübergehend: */
            if (LIMIT_MINIMUM_THUMB_SIZE) {
                LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
                UIDefaults defaults = lookAndFeel.getDefaults();
                defaults.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static JDialog createDialog() {
        JDialog dialog = new JDialog();
        dialog.setTitle("Langer Beispieltext");

        dialog.setModalityType(ModalityType.APPLICATION_MODAL);
        dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        dialog.setLayout(new BorderLayout());

        dialog.add(createCenterPart(), BorderLayout.CENTER);

        dialog.pack();
        dialog.setLocation(150, 90);

        return dialog;
    }

    private static Component createCenterPart() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        JTextArea area = new JTextArea();
        area.setText(getLongLoremIpsumText());
        panel.add(area, BorderLayout.CENTER);

        JScrollPane scroll = new JScrollPane();
        scroll.setViewportView(panel);
        scroll.setPreferredSize(new Dimension(800, 600));

        return scroll;
    }

    private static String getLongLoremIpsumText() {
        StringBuilder builder = new StringBuilder();

        for (int i=0; i<REPEAT; ++i) {
            builder.append(getLoremIpsumText());
            if (i < REPEAT - 1) {
                builder.append("

");
            }
        }

        return builder.toString();
    }

    private static String getLoremIpsumText() {
        return "Lorem ipsum dolor sit amet, consectetur adipisici " + "
"
                + "elit, sed eiusmod tempor incidunt ut labore et dolore " + "
"
                + "magna aliqua. Ut enim ad minim veniam, quis nostrud " + "
"
                + "exercitation ullamco laboris nisi ut aliquid ex ea " + "
"
                + "commodi consequat. Quis aute iure reprehenderit in " + "
"
                + "voluptate velit esse cillum dolore eu fugiat nulla " + "
"
                + "pariatur. Excepteur sint obcaecat cupiditat non proident, " + "
"
                + "sunt in culpa qui officia deserunt mollit anim id est " + "
"
                + "laborum.";
    }

}