Как выбрать то, что JPanel в разделенной панели изменяет размер, когда все приложение. изменен размер?
Поэтому я программирую приложение, используя Java Swing, и мне интересно, как сделать так, чтобы при изменении размера всего приложения только некоторые панели изменяли размеры различными способами. Посмотрите на две картинки ниже:
У меня есть три вертикальные панели, как вы можете видеть. Теперь, когда высота приложения увеличена, высота всех трех панелей также должна увеличиться, что работает нормально. Однако, когда ширина увеличивается, я хочу, чтобы ширина только средней панели (которая будет "рабочей областью") увеличивалась. Вместо этого, как вы можете видеть, последняя третья панель справа - единственная, ширина которой увеличивается.
Как мне сделать так, чтобы только середина JPanel
растягивается и сжимается при изменении размера всего окна по оси x? Кроме того, позже я хотел бы сделать так, чтобы эта панель рабочего пространства не всегда была посередине; так как пользователь может перемещать две другие панели, чтобы настроить приложение по своему вкусу, например, чтобы две другие панели располагались друг над другом слева, а рабочая область - справа. Однако, независимо от того, где она находится, я хочу, чтобы панель рабочего пространства имела размеры, как мне это сделать?
2 ответа
Хитрость заключается в том, чтобы позвонить setResizeWeight(double)
на правильной разделенной панели с соответствующим значением. НАПРИМЕР
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class DualingSplitPanes {
private JComponent ui = null;
DualingSplitPanes() {
initUI();
}
protected final void addPanelsToUi(JPanel p1, JPanel p2, JPanel p3) {
JSplitPane sp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p1, p2);
JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp1, p3);
sp2.setResizeWeight(1);
ui.add(sp2);
}
public void initUI() {
if (ui!=null) return;
ui = new JPanel(new BorderLayout(4,4));
ui.setBorder(new EmptyBorder(4,4,4,4));
JPanel treeContainer = new JPanel(new GridLayout());
JTree tree = new JTree();
tree.setVisibleRowCount(5);
for (int i=tree.getVisibleRowCount()-1; i>-1; i--) {
tree.expandRow(i);
}
treeContainer.add(new JScrollPane(tree));
JPanel workSpaceContainer = new JPanel(new GridLayout());
workSpaceContainer.add(new JTextArea(5, 10));
JPanel searchContainer = new JPanel(new BorderLayout(4, 4));
searchContainer.add(new JScrollPane(new JTextArea(5, 10)));
addPanelsToUi(treeContainer, workSpaceContainer, searchContainer);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
DualingSplitPanes o = new DualingSplitPanes();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
Вы можете установить ограничения для блоков, чтобы они зависели от соответствующей стороны окна.
Таким образом, левая панель - это X пикселей слева, а правая - Y пикселей справа, а затем средняя ограничена наличием левой стороны X+ слева и правой стороны Y+ справа.
Это работает до тех пор, пока вы не измените размер окна слишком маленьким (потому что тогда элементы станут слишком большими).