JProgressbar width с использованием Grid / FlowLayout

Я работаю над загрузчиком, который сейчас выглядит следующим образом:

Screenshot

JFrame использует BorderLayout. На СЕВЕРЕ у меня есть JPanel (FlowLayout). На ЮГЕ также есть JPanel (FlowLayout), на ЗАПАДЕ у меня просто JTextArea (в JScrollPane). Все это показано правильно. Однако в EAST у меня в настоящее время есть JPanel (GridLayout (10, 1)).

Я хочу отображать до 10 JProgressBars в разделе EAST, которые добавляются и удаляются с панели динамически. Проблема в том, что я не могу заставить их выглядеть так, как я хочу, чтобы они смотрели: я хочу, чтобы ширина JProgressBars заполняла весь раздел EAST, потому что 1) это придает приложению более симметричный вид и 2) ProgressBars может содержать длинные струны, которые сейчас не подходят. Я попытался поместить JPanel, который содержит GridLayout (10, 1), в схему потока, а затем поместить эту схему расположения в раздел EAST, но это тоже не сработало.

Мой код (SSCCE) в настоящее время выглядит следующим образом:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        new DownloadFrame();
    }

    private static class DownloadFrame extends JFrame {

        private JButton downloadButton;
        private JTextField threadIdTextField;
        private JTextArea downloadStatusTextArea;
        private JScrollPane scrollPane;
        private JTextField downloadLocationTextField;
        private JButton downloadLocationButton;

        private JPanel North;
        private JPanel South;
        private JPanel ProgressBarPanel;

        private Map<String, JProgressBar> progressBarMap;

        public DownloadFrame() {
            InitComponents();
            InitLayout();
            AddComponents();
            AddActionListeners();

            setVisible(true);
            setSize(700, 300);
        }

        private void InitComponents() {
            downloadButton = new JButton("Dowload");
            threadIdTextField = new JTextField(6);
            downloadStatusTextArea = new JTextArea(10, 30);
            scrollPane = new JScrollPane(downloadStatusTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            downloadLocationTextField = new JTextField(40);
            downloadLocationButton = new JButton("...");
            North = new JPanel();
            South = new JPanel();
            ProgressBarPanel = new JPanel();
            progressBarMap = new HashMap<String, JProgressBar>();
        }

        private void InitLayout() {
            North.setLayout(new FlowLayout());
            South.setLayout(new FlowLayout());
            ProgressBarPanel.setLayout(new GridLayout(10, 1));
        }

        private void AddComponents() {
            North.add(threadIdTextField);
            North.add(downloadButton);
            add(North, BorderLayout.NORTH);

            add(ProgressBarPanel, BorderLayout.EAST);

            South.add(downloadLocationTextField);
            South.add(downloadLocationButton);
            add(South, BorderLayout.SOUTH);

            add(scrollPane, BorderLayout.WEST);
        }

        private void AddActionListeners() {
            downloadButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    addNewProgessBar(threadIdTextField.getText());
                }
            });
        }

        public void addNewProgessBar(String threadId) {
            JProgressBar progressBar = new JProgressBar();
            progressBar.setStringPainted(true);
            progressBarMap.put(threadId, progressBar);
            drawProgessBars();
        }

        void drawProgessBars() {
            ProgressBarPanel.removeAll();
            for (JProgressBar progressBar : progressBarMap.values()) {
                ProgressBarPanel.add(progressBar);
            }
            validate();
            repaint();
        }

    }
}

Заранее спасибо.

ИЗМЕНИТЬ

Самое простое решение: изменить

add(ProgressBarPanel, BorderLayout.EAST);

на

add(ProgressBarPanel, BorderLayout.CENTER);
5
задан Matthias 24 July 2011 в 12:20
поделиться