Как мне сделать обтекание FlowLayout внутри JSplitPane? - PullRequest
1 голос
/ 19 апреля 2011

Я написал этот пример кода, чтобы проиллюстрировать проблему с моей программой.

Я ожидаю, что смогу сдвинуть ползунок JSplitPane влево, за край кнопок, сжимая этоJPanel, и FlowLayout переносит кнопки во второй ряд.

Вместо этого JSplitPane не позволяет мне перемещать ползунок за крайнюю правую кнопку на экране, и если я изменяю размер всего JFrame, чтобы заставитьСжатие, кнопки (я полагаю) просто бегут с правой стороны JPanel, под ползунком (наверное, потому что я их явно не вижу).

Что я делаю не так?

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class Driver implements Runnable {
    public static void main(String[] args) {
        (new Driver()).run();
    }
    public void run() {
        try {
            go();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
    private void go() throws Exception {
        JFrame jframe = new JFrame("FlowLayoutTest");
        JPanel left = new JPanel();
        left.setBackground(Color.RED);
        left.setLayout(new BorderLayout());
        JPanel right = new JPanel();
        right.setBackground(Color.BLUE);
        right.setLayout(new BorderLayout());
        JSplitPane topmost =
            new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
        jframe.setContentPane(topmost);
        JPanel bottomleft = new JPanel();
        bottomleft.setBackground(Color.GREEN);
        bottomleft.setLayout(new FlowLayout());
        left.add(bottomleft, BorderLayout.PAGE_END);
        for (int i = 0; i < 10; i++) {
            bottomleft.add(new JButton("" + i));
        }
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Ответы [ 2 ]

6 голосов
/ 19 апреля 2011

Есть ли другой менеджер компоновки, кроме FlowLayout, который будет делать то, что я ищу?

Wrap Layout должно работать.

1 голос
/ 19 апреля 2011

Если вы добавите

bottomleft.setMinimumSize(new Dimension(0, 0));

перед пакетом (), то он будет перекомпонован.НО, он не будет перепаковывать макет границы, поэтому вместо двух строк вы получите одну, а остальные обрезаны.Поэтому после изменения размера вам придется перепаковать макет границы.Если вы пропустите макет границы, он будет перекрашиваться так, как вы хотите.

Тем не менее, вы должны избегать FlowLayout, как чума.Большинство макетов, которые идут с Swing, плохие, но FlowLayout - один из худших нарушителей.

...