#java #swing #user-interface #gridbaglayout
#java #swing #пользовательский интерфейс #gridbaglayout
Вопрос:
Я устал от Java GridBagLayout. Я хочу создать панель, похожую на ту, что показана на рисунке ниже, но я не смог ее получить. Я не могу расположить левую панель, и мне не удалось сделать панели длинными. Ширина не увеличивается, когда я устанавливаю gridWidth. Я не могу использовать для этого никаких разработчиков графического интерфейса. Я хочу получить макет, подобный изображению ниже.
Это неудачный код:
public class gui3 extends Frame{
Panel p1,p2,p3,p4,p5,p6,p7,pmain;
gui3(){
setVisible(true);
setSize(500,500);
setTitle(" Calculator ");
GridBagLayout gb1=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
setLayout(gb1);
p1=new Panel();
p1.setBackground(Color.BLACK);
gbc.gridx=5;
gbc.gridy=0;
gbc.gridwidth=3;
//gbc.weightx =0.5;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p1,gbc);
p2=new Panel();
p2.setBackground(Color.BLUE);
gbc.gridx=0;
gbc.gridy=1;
gbc.gridwidth=2;
// gbc.weightx = 1;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p2,gbc);
p3=new Panel();
p3.setBackground(Color.GREEN);
gbc.gridx=0;
gbc.gridy=2;
gbc.gridwidth=2;
// gbc.weightx = 1;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p3,gbc);
p4=new Panel();
p4.setBackground(Color.cyan);
gbc.gridx=0;
gbc.gridy=3;
gbc.gridwidth=2;
// gbc.weightx = 1;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p4,gbc);
p5=new Panel();
p5.setBackground(Color.RED);
gbc.gridx=0;
gbc.gridy=4;
gbc.gridwidth=2;
// gbc.weightx = 1;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p5,gbc);
p6=new Panel();
p6.setBackground(Color.pink);
gbc.gridx=0;
gbc.gridy=5;
gbc.gridwidth=2;
// gbc.weightx = 1;
// gbc.fill=GridBagConstraints.HORIZONTAL;
add(p6,gbc);
p7=new Panel();
p7.setBackground(Color.yellow);
gbc.gridx=6;
gbc.gridy=0;
gbc.gridheight=6;
// gbc.weightx = 1;
gbc.fill=GridBagConstraints.HORIZONTAL;
add(p7,gbc);
}
}
Комментарии:
1. GBC основаны на столбцах, затем для создания матрицы с 6/7 столбцами и 6 строками
2. все зависит от того, будет ли / как он будет изменяться
Ответ №1:
Вы имеете в виду что-то вроде…
Таким образом, в принципе, вы можете использовать GridBagConstraints#gridheight
(или gridwidth
) для установки количества ячеек сетки, которые будет охватывать компонент
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestLayout {
public static void main(String[] args) {
new TestLayout();
}
public TestLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridx = 0;
gbc.weightx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
frame.add(createPane(Color.RED), gbc);
gbc.gridy ;
frame.add(createPane(Color.GREEN), gbc);
gbc.gridy ;
frame.add(createPane(Color.BLUE), gbc);
gbc.gridy ;
frame.add(createPane(Color.CYAN), gbc);
gbc.gridy ;
frame.add(createPane(Color.MAGENTA), gbc);
gbc.gridy ;
frame.add(createPane(Color.ORANGE), gbc);
gbc.gridy ;
frame.add(createPane(Color.PINK), gbc);
gbc.gridx ;
gbc.weightx = 0;
gbc.gridy = 0;
gbc.weighty = 1;
gbc.gridheight = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.VERTICAL;
frame.add(createPane(Color.YELLOW), gbc);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public JPanel createPane(Color color) {
JPanel pane = new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
pane.setBackground(color);
return pane;
}
}
Посмотрите, как использовать GridBagLayout для получения более подробной информации
Комментарии:
1. конечно, это то, что я need.it это действительно полезно. но когда я изменяю размер по вертикали, строки внезапно становятся такими узкими. могу ли я избежать этого
2. Это произойдет, когда доступное пространство будет меньше предпочтительного размера компонентов. Единственный способ действительно избежать этого — поместить компонент в область прокрутки
3. Это можно легко исправить; см. Мой ответ.
4. @JanBodnar Да, молодец, ты взял проблему вне контекста и предоставил произвольное решение, которое может отрицательно повлиять на то, что на самом деле пытается сделать OP. Переопределение предпочтительных / минимальных размеров компонентов должно быть последним средством. Добавление компонентов в панели и предоставление ограничений макета было бы более универсальным решением.
5. @MadProgrammer Ну, мой пост может выглядеть как критика, но это не должно было быть. Просто эти резкие изменения часто путают новичков, когда они используют GridBagLayout. Я просто хотел сообщить, что это можно исправить двумя способами: установить минимальный размер на предпочтительный размер или правильно установить веса. Оба ИМХО действительны.
Ответ №2:
Резкие изменения размера от решения MadProgrammer можно легко исправить двумя способами:
public JPanel createPane(Color color) {
JPanel pane = new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(50, 50);
}
};
pane.setBackground(color);
return pane;
}
Мы также предоставляем минимальный размер, который равен предпочтительному размеру.
Таким образом, панели не сжимаются, но они вырезаются из окна
, когда контейнер слишком мал для их отображения.
Оптимальное решение, вероятно, установить значение weighty
1. Панели будут постепенно уменьшаться.
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridy = 0;
Наконец, я также создал решение с MigLayout
помощью . Если возможно, попробуйте
создавать свои макеты с MigLayout
помощью, а не с GridBagLayout
помощью .
package com.zetcode;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class MigLayoutPanels extends JFrame {
public MigLayoutPanels() {
initUI();
setTitle("Panels");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
setLayout(new MigLayout("wrap"));
add(createPanel(), "w 200, push, grow");
add(createPanel(), "push, grow");
add(createPanel(), "push, grow");
add(createPanel(), "push, grow");
add(createPanel(), "push, grow");
add(createPanel(), "push, grow");
add(createPanel(), "cell 1 0 1 6, growy");
pack();
}
public JPanel createPanel() {
JPanel pnl = new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
pnl.setBorder(BorderFactory.createEtchedBorder());
return pnl;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigLayoutPanels ex = new MigLayoutPanels();
ex.setVisible(true);
}
});
}
}
GridBagLayout
это мощный менеджер, который можно использовать для создания большинства макетов.
Многие программисты считают его сложным в использовании. MigLayout
проще для понимания,
более мощный и гораздо менее подробный.