Бих искал да оформя компоненти, както е показано на снимката, само с помощта на GridBagLayout
.
Опитах няколко ограничения, но никога не се стигна до очаквания резултат, така че се чудя дали наистина е възможно само с GridBagLayout
. Трудността е за компонентите C1, C2 и C3.
C1 и C2 са JComponent
, които ще задържат други компоненти вътре като JPanel
. Задал съм техния минимален и предпочитан размер. C3 е JButton
.
C1 не трябва да заема допълнително място, затова зададох теглото му x на 0 и ширината на мрежата на 1 (пробвах и с 2, тъй като обхваща C2 и C3).
C2 заема цялото допълнително пространство, зададох теглото му x на 1 и ширината на мрежата на 3.
GUI не може да се преоразмерява.
Използвах този LayoutManager
няколко пъти, но все още не го овладявам, благодаря ви за малко помощ.
Трудности с GridBagLayout
comment
1) Добавете някакъв контекст към области C1, 2 и 3. Какво има в тези области? 2) Трябва ли да може да се променя размера? Къде трябва да се присвои допълнително пространство и височина на GUI?
- person Andrew Thompson   schedule 30.11.2012
comment
правилно (както спомена @Andrew Thompson), трябва да поставите там невидими JComponents или JLabel, но трябва да зададете GBC правилно, или можете да създадете матрица (вземете най-малкото измерение) от JLabels в горната част, след което да използвате само номера на GBC колони за това
- person mKorbel   schedule 30.11.2012
Отговори (2)
Ще говоря само за
GridBagLayout
, дори това може да е работа точно заMigLayout
(MigLayout има допълнителен параметър за запълване на номера на колони и редове, преоразмеряване, т.е.) и/илиTableLayout(???)
GridBagLayout
изисква само попълване на всички желани брой колони в първия ред (само), след което се създава матрица и можете да дефинирате каквото и да еGBC weightx, weighty, gridx, gridy
и/или сAnchor
същопример говорим за
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class GbcLayout {
private JFrame frame = new JFrame("GbcLayoutGbcLayout");
private JPanel panel = new JPanel();
private JLabel hidelLabel;
private JLabel firstLabel;
private JTextField firstText;
public GbcLayout() {
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
for (int k = 0; k < 50; k++) {
hidelLabel = new JLabel(" ");
hidelLabel.setOpaque(true);
hidelLabel.setBackground(Color.orange);
hidelLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.weighty = 0.5;
gbc.gridx = k;
gbc.gridy = 0;
panel.add(hidelLabel, gbc);
}
for (int k = 0; k < 5; k++) {
firstLabel = new JLabel("Testing Label : ", SwingConstants.RIGHT);
firstLabel.setFont(new Font("Serif", Font.BOLD, 20));
firstLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridx = 0;
gbc.gridwidth = 8;
gbc.gridy = k + 1;
panel.add(firstLabel, gbc);
}
for (int k = 0; k < 5; k++) {
firstText = new JTextField("Testing TextField");
firstText.setFont(new Font("Serif", Font.BOLD, 20));
firstText.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridx = 9;
gbc.gridwidth = k + 8;
gbc.gridy = k + 1;
panel.add(firstText, gbc);
}
for (int k = 0; k < 5; k++) {
firstLabel = new JLabel("Testing Label : ", SwingConstants.RIGHT);
firstLabel.setFont(new Font("Serif", Font.BOLD, 20));
firstLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridx = 20 + k;
gbc.gridwidth = 8;
gbc.gridy = k + 1;
panel.add(firstLabel, gbc);
}
for (int k = 0; k < 5; k++) {
firstText = new JTextField("Testing TextField");
firstText.setFont(new Font("Serif", Font.BOLD, 20));
firstText.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridx = 29 + k;
gbc.gridwidth = 21 - k;
gbc.gridy = k + 1;
panel.add(firstText, gbc);
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GbcLayout gbcl = new GbcLayout();
}
});
}
}
person
mKorbel
schedule
30.11.2012
Страхувам се, че е невъзможно. GridBagLayout
не може да разбере какво е правилното разстояние между началото на C1 и началото на C3.
person
StanislavL
schedule
30.11.2012