Има ли мениджър на оформлението, който дава същата степен на контрол като Absolute Позициониране? Но също така прави възможно автоматичното преоразмеряване? Нещо, където можете да поставите елементи, използвайки относителни координати?
Алтернатива на абсолютното оформление?
Отговори (3)
GridBagLayout
е най-гъвкавият стандартен мениджър на оформление в Swing и може постигнете практически всичко, от което се нуждаете, макар и далеч не толкова просто, колкото си представяте, като използвате само относителни координати (това, което имате предвид, предполагам, е 0-100% спрямо размера на рамката).
Можете да намерите официалната документация за GridBagLayout
тук , който също има някои цифри и примери.
Можете също да разгледате MiG Layout с отворен код, който е много по-удобен че GridBagLayout
и също малко по-мощен. Това е майката на всички мениджъри на оформление.
Най-мощният мениджър на оформление в JDK е GridBagLayout
. Типичният потребителски интерфейс обаче съдържа композиция от панели, всеки от тях е конфигуриран да използва различно оформление. Например оформление на граници за цял прозорец, оформление на потока за панел, който съдържа набор от бутони, GridLayout
или GridBagLayout
за сложни части.
Можете също така да разгледате алтернативи като MigLayout - много мощен инструмент, който позволява създаване на почти всеки изглед, който можете да си представите.
Друг вариант е да използвате SpringLayout (лично аз харесвам GridBagLayout).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.SpringLayout.*;
public class SpringScaleTest {
public JComponent makeUI() {
SpringLayout layout = new SpringLayout();
JPanel p = new JPanel(layout);
p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10));
JLabel l1 = new JLabel("label: width=90%", SwingConstants.CENTER);
l1.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
JButton l2 = new JButton("button: width=50%");
Spring panelw = layout.getConstraint(WIDTH, p);
SpringLayout.Constraints c1 = layout.getConstraints(l1);
c1.setX(Spring.constant(0));
c1.setY(Spring.constant(20));
c1.setWidth(Spring.scale(panelw, 0.9f));
p.add(l1);
SpringLayout.Constraints c2 = layout.getConstraints(l2);
c2.setWidth(Spring.scale(panelw, 0.5f));
layout.putConstraint(SOUTH, l2, -20, SOUTH, p);
layout.putConstraint(EAST, l2, -20, EAST, p);
p.add(l2);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new SpringScaleTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}