#java #swing #layout-manager
#java #swing #layout-manager
Вопрос:
Я написал этот пример кода, чтобы проиллюстрировать проблему, с которой я столкнулся в своей программе.
Я ожидаю, что смогу сдвинуть ползунок JSplitPane влево, за пределы кнопок, сжимая эту JPanel, и потоковое описание перенесет кнопки во вторую строку.
Вместо этого 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);
}
}
Ответ №1:
Есть ли другой менеджер компоновки, кроме FlowLayout, который будет делать то, что я ищу?
Макет переноса должен работать.
Ответ №2:
Если вы добавите это
bottomleft.setMinimumSize(new Dimension(0, 0));
перед pack () он будет повторно выполнен. НО это не приведет к повторной упаковке макета границы, поэтому вместо двух строк вы получите одну с обрезанными остальными. Итак, после изменения размера вам придется перепаковать макет границы. Если вы опустите макет границы, он будет перерисован так, как вы хотите.
Тем не менее, вам следует избегать потокового описания как чумы. Большинство макетов, которые поставляются с Swing, плохие, но FlowLayout — один из худших нарушителей.
Комментарии:
1. Проблема в том, что в моей программе есть фактические данные в других разделах BorderLayout, но их удаление не влияет на поведение ‘bottomleft’, поэтому мой макет их опускает.
2. Есть ли другой менеджер компоновки, кроме FlowLayout, который будет делать то, что я ищу? (начните с одной строки, перенесите на вторую и разверните компонент вверх)
3. «Итак, после изменения размера вам придется перепаковать макет границы». Куда бы мне вставить какой-нибудь код для запуска «после изменения размера»?
4. @Adam, с потоковым описанием все в порядке. Он был разработан для конкретной функции и чрезвычайно прост в использовании благодаря своей разработанной функциональности.
5. @Adam, потоковое описание просто предназначено для переноса компонентов в строку. Это хорошо подходит для любого диалогового окна, где у вас есть кнопки «Ок» и «Отмена», выровненные по правому краю на ЮЖНОЙ панели BorderLayout. У каждого макета есть цель, если вы используете его правильно. Он никогда не был разработан для многоцелевого макета с десятками ограничений, которые вам нужно настроить, чтобы заставить его работать должным образом. Графический интерфейс должен быть создан с использованием правильной комбинации менеджеров компоновки. Это не должно быть одного размера для всех.