0
GroupLayout 관리자가있는 JPanel이있는 JDialog가 있습니다.JPanel 및 GroupLayout 관리자로 JDialog 크기 조정
생성되는 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());
}
});
생성자 (DialogPanel이 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();
}
그리고 생성 대화 내용 :
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]);
}
너비를 늘리면 모든 것이 정상이며 구성 요소가 너비에 맞습니다. 나는 폭 구성 요소를 감소 할 때
는 그러나 자신의 폭을 감소하지 않습니다. 나는 스크롤 바를 원하지 않는다. 대화 창 너비의 구성 요소 맞춤을 원합니다 (아래의 원하지 않는 결과입니다. 첫 번째 이미지와 같아야 함). 나도 몰라
가능한 경우 MigLayout을 사용하는 것이 좋습니다. 그렇지 않으면 일련의 복합 레이아웃 관리자를 사용해야합니다. – MadProgrammer
@MadProgrammer는 아이디어에 대해 감사드립니다. GridBagLayout을 사용하여 레이아웃을 변경 했으므로 모든 것이 적합합니다. –