Swing Reload JPanel + darin liegende ProgressBar

ThomJava

Mitglied
Moin,

bin gerade dabei eine kleine Übersicht für Festplattenspeicher zuprogrammieren. Bin neu in der GUI-Programmierung in Java.

HauptPanel wird auf einem JScrollPane geadded.
Beim Erstellen des HauptPanels werden kleinere Panels für die jeweiligen Server erstellt und hinzugefügt.
Im Panel wird nun nacheinander ProgressBar und Labels geadded.

Nun möchte ich das gesamte HauptPanel + den Inhalt (Progressbar und die Labels) mit einem Button-Klick aktuallisieren.
Leider hab ich nach etlichen Versuchen mit repaint() und validate(); kein weiteren Lösungsvorschlag übrig.
Ich hoffe jemand hier kann mir weiterhelfen.

Java:
private JScrollPane getDiskSpaceScPane()
{
    if(diskspaceScPane == null)
    {
        diskspaceScPane = new JScrollPane(getDiskSpacePanel());
        diskspaceScPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        diskspaceScPane.setPreferredSize(new Dimension(250,800));
    }
    return diskspaceScPane;
}
// HauptPanel
private JPanel getDiskSpacePanel()
{
    diskspacePanel = new JPanel();
    diskspacePanel.setBorder(BorderFactory.createTitledBorder("Server-Speicher"));
    diskspacePanel.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
    for(int i = 0; i < serverList.size(); i++)
    {
        gbc.gridy = i;
        // für jeden Server ein eigenes "Mini"-Panel
        diskspacePanel.add(getDiskPanel(serverList.get(i)), gbc);
    }
    return diskspacePanel;
}
// JPanel für jeden Server
private JPanel getDiskPanel(String name)
{
    diskPanel = new JPanel();
    diskPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(1), name));
    diskPanel.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.VERTICAL;
    for(int i = 0, progressPos = 0, labelPos = 1; i < get_disk_usage(name).size(); i++, progressPos+=2, labelPos+=2)
    {
        // partitionLetter, valueInPercent, totalSpace, freeSpace werden hier gesetzt
        gbc.gridx = 0;
        gbc.gridy = progressPos;
        gbc.insets = new Insets(0, 0, 0, 10);
        diskPanel.add(getDiskPartitionLabel(partitionLetter), gbc);
        gbc.gridx = 1;
        gbc.gridy = progressPos;
        gbc.insets = new Insets(0, 0, 0, 0);
        diskPanel.add(getProgressBar(valueInPercent), gbc);
        gbc.gridx = 1;
        gbc.gridy = labelPos;
        gbc.insets = new Insets(0, 0, 10, 0);
        diskPanel.add(getDiskValueStatusLabel(totalSpace, freeSpace), gbc);   
    }
    return diskPanel;
}

private JProgressBar getProgressBar(int value)
{
    progressBar = new JProgressBar();
    progressBar.setValue(value);
    progressBar.setString(Integer.toString(value)+"%");
    progressBar.setStringPainted(true);
    progressBar.setPreferredSize(new Dimension(100,25));
    return progressBar;
}
private JLabel getDiskPartitionLabel(String diskPartition)
{
    diskPartitionLabel = new JLabel(diskPartition);
    return diskPartitionLabel;
}
private JLabel getDiskValueStatusLabel(int totalSpace, int freeSpace)
{
    String text = freeSpace+" GB frei von "+totalSpace+" GB";
    diskValueStatusLabel = new JLabel(text);
    return diskValueStatusLabel;
}

private void refreshServerDiskSpace()
{
    /*Hier soll das aktuallisieren des GUI stehen*/
}
 
Nun möchte ich das gesamte HauptPanel + den Inhalt (Progressbar und die Labels) mit einem Button-Klick aktuallisieren.
Leider hab ich nach etlichen Versuchen mit repaint() und validate(); kein weiteren Lösungsvorschlag übrig.
Natuerlich funktioniert das nicht, du musst deine Logik nochmal ausfuehren welche alle Werte auf die Steuerelemente setzt, ansonsten wird ja einfach nur der aktuelle Zustand (sprich das was initial gesetzt wurde) nochmal neu gezeichnet. Also in deinem Fall klingt das nach aktuelles Panel wegwerfen und ein neues erzeugen.
 
Das heißt ich muss:

Java:
private void refreshServerDiskSpace()
{
    diskspaceScPane.removeAll();
    diskspaceScPane.add(getDiskSpacePanel());
}
machen? Die neuen Werte werden ja in den kleineren Panels (beim hinzufügen der Labels / ProgressBars) gesetzt.
 
Das Layout bleibt gleich. Er geht auch durch meinen Sysout in der get-Methode, aber wird nichts im ScrollPane angezeigt. Hab in der selben GUI-Klasse ausgeführt. (Hoffe du meinst das mit UI-Thread)
 
Ohne das ganze Programm gerade schwierig zu sagen, aber vermutlich wird das Layout anschlieszend nicht passen. Entweder das, oder das Fenster wird aus irgendeinem Grund nicht neu gezeichnet. Am besten du betrachtest mal den Zustand von dem Panel nachdem es hinzugefuegt wurde, vermutlich wird das die falsche Groesze haben.
 
Nach etlichen Versuchen die einzelnen Panels neuzuladen hatte ich vorgestern endlich die Lösung gefunden. Ich musste mit einer for()-Schleife jedes einzelne Objekt in den Panels entfernen. Und dann habe ich die Objekte wieder hinzugefügt und mit revalidate(); und repaint(); neugezeichnet.
 

Zurück
Oben