J'ai JDialog qui a un JPanel avec gestionnaire GroupLayout. J'ai le code suivant:Redimensionner JDialog avec JPanel et gestionnaire GroupLayout
Créer JDialog:
DialogPanel rectangeDialog = new DialogPanel(clickedObject);
rectangeDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowLostFocus(WindowEvent e) {
MainFrame.closeDialog(rectangeDialog.getModul());
}
@Override
public void windowClosing(WindowEvent e) {
MainFrame.closeDialog(rectangeDialog.getModul());
}
});
Constructor (DialogPanel étend JDialog):
private static final int DIALOG_HEIGHT = 550;
private static final int DIALOG_WIDTH = 1050;
private RectangleModul modul = new RectangleModul();
private static final ImageIcon deleteIcon = createImageIcon("../resource/images/delete.gif");
//Label-а за пътя и подравняване вдясно
private JLabel idTxt = new JLabel();
//Input полето за път на квадратчето
private JTextField id = new JTextField(JTextField.RIGHT);
//Label-а за пътя и подравняване вдясно
private JLabel pathTxt = new JLabel();
//Input полето за път на квадратчето
private JTextField path = new JTextField(JTextField.LEFT);
//Label-а за ниво и подравняване вдясно
private JLabel levelTxt = new JLabel();
//Input полето за ниво на квадратчето
private JTextField level = new JTextField();
//Label-а за име на квадратчето
private JLabel appellationTxt = new JLabel();
//Input полето за име на квадратчето
private JTextField appellation = new JTextField();
//Полето съдържащо описанието на квадрадтчето
private JTextArea description = new JTextArea();
//Таблицата с елемите с дежав
private JTable childrenTable;
public DialogPanel(RectangleModul modul) {
super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
//data initialization...
createDialogContent();
}
Et la création de contenu dialogue:
private void createDialogContent() {
JPanel panel = new JPanel();
//Панелът, който съдържа елемните
panel.setSize(DIALOG_WIDTH + 10, DIALOG_HEIGHT + 10);
panel.setAutoscrolls(false);
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
//Layout на групите в панела
GroupLayout layout = new GroupLayout(panel);
//Вклюване на задаването на разстояния между елементите
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
panel.setLayout(layout);
//Area-та за описанието на квадратчето
Border insideDescriptionBorder = BorderFactory.createTitledBorder("Описание");
//ScrollBar-ът да полето за описание на квадратчето
JScrollPane scrollArea = new JScrollPane(description);
scrollArea.getVerticalScrollBar().setUnitIncrement(16);
scrollArea.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollArea.setBorder(insideDescriptionBorder);
JScrollPane childrenTableScrollPane = new JScrollPane(childrenTable);
childrenTableScrollPane.getVerticalScrollBar().setUnitIncrement(16);
childrenTableScrollPane.setMaximumSize(new Dimension(20, 100));
childrenTableScrollPane.setMinimumSize(new Dimension(20, 100));
childrenTableScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//Панелът, който съдържа бутоните на диалоговия прозорец
JPanel panelButtons = new JPanel();
panelButtons.setMaximumSize(new Dimension(20, 100));
//Бутонът за запазване
JButton saveBtn = new JButton("Запази");
saveBtn.addActionListener((ActionEvent e) -> {
//...
});
panelButtons.add(saveBtn);
//Бутонът за създаване на ново дете
JButton addChildBtn = new JButton("Ново дете");
addChildBtn.addActionListener((ActionEvent e) -> {
RectangleModul newModul = new RectangleModul(modul.getLevel() + 1, "Нов елемент", "", modul, new ArrayList<>(), new Polygon());
addChild(newModul);
DialogPanel newDialogPanel = new DialogPanel(newModul);
newDialogPanel.setDefaultCloseOperation(DialogPanel.DISPOSE_ON_CLOSE);
newDialogPanel.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//...
}
});
newDialogPanel.setVisible(true);
MainFrame.getOpenPanels().add(newDialogPanel);
});
panelButtons.add(addChildBtn);
//Бутонът за изтриване на елемнта и неговите деца
JButton deleteBtn = new JButton(modul.getLevel() == 0 ? "Изчисти проект" : "Изтрий");
deleteBtn.addActionListener((ActionEvent e) -> {
//...
});
panelButtons.add(deleteBtn);
panelButtons.setLayout(new FlowLayout(FlowLayout.LEFT));
panelButtons.setSize(310, 10);
layout.setHonorsVisibility(true);
//Хозиронталното подравняване на елемнтите в Layout-а
layout.setHorizontalGroup(layout.createSequentialGroup()/*.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)*/
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(scrollArea, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(childrenTable.getTableHeader(), GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(childrenTableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(pathTxt)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(path, 100, 100, 100)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(idTxt)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(id, 50, 50, 50)
)
)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(levelTxt)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(level, 50, 50, 50)
)
)
)
)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(appellationTxt)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(appellation, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
)
)
)
.addComponent(panelButtons, 310, 310, 310)
)
);
//Задане на panelButtons, levelTxt, id и level да са с константна ширина
layout.linkSize(SwingConstants.HORIZONTAL, levelTxt, level, id);
//Вертикално подравняване на елемнтите в Layout-а
layout.setVerticalGroup(layout.createSequentialGroup().addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(idTxt)
.addComponent(id, 25, 25, 25)
.addComponent(pathTxt)
.addComponent(path, 25, 25, 25)
.addComponent(levelTxt)
.addComponent(level, 25, 25, 25)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(appellationTxt)
.addComponent(appellation, 25, 25, 25)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(scrollArea)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(childrenTable.getTableHeader())
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(childrenTableScrollPane, 100, 100, 100)
)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(panelButtons, 35, 35, 35)
)
);
//Задаване на panelButtons да е с константна височина
layout.linkSize(SwingConstants.VERTICAL, childrenTableScrollPane);
add(panel);
//Диалоговите прозорци не са модални с цел да може да се виждат по няколко едновременно
setModal(false);
//Името на диалоговия прозотец ще бъде пътя до квадратчето и неговото име
setTitle(String.format("%s%s%s - %s", modul.getPath(), modul.getPath().length() > 0 ? "." : "", modul.getId(), modul.getName()));
setMinimumSize(new Dimension(DIALOG_WIDTH, DIALOG_HEIGHT));
setPreferredSize(new Dimension(DIALOG_WIDTH, DIALOG_HEIGHT));
//Локализиране на диалогът в горната част на основния прозорец в центъра. Взема се спрямо позицията на root елемента
setLocation(MainFrame.getRoot().getPolygon().xpoints[0] + RectangleModul.BODY_WIDTH/2 - getWidth()/2, MainFrame.getRoot().getPolygon().ypoints[0]);
}
Lorsque j'augmente la largeur, tout est OK et les composants correspondent à la largeur.
Mais quand je DIMINUÉ la composante largeur ne ne diminue pas leur largeur. Je ne veux pas de barre de défilement. Je veux un ajustement de composant de la largeur de la fenêtre de dialogue (ci-dessous est un résultat indésirable, il doit être comme la première image).
Je vous recommande d'utiliser un gestionnaire de disposition différent, peut-être MigLayout si vous le pouvez, sinon vous aurez besoin d'utiliser une série de gestionnaires de mise en page composés – MadProgrammer
@MadProgrammer grâce à idée. Je change de mise en page avec GridBagLayout et maintenant tout va bien. –