2017-02-07 31 views
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]); 
} 

대화이다 : 나는 다음과 같은 코드가 enter image description here

너비를 늘리면 모든 것이 정상이며 구성 요소가 너비에 맞습니다. 나는 폭 구성 요소를 감소 할 때

enter image description here

는 그러나 자신의 폭을 감소하지 않습니다. 나는 스크롤 바를 원하지 않는다. 대화 창 너비의 구성 요소 맞춤을 원합니다 (아래의 원하지 않는 결과입니다. 첫 번째 이미지와 같아야 함). 나도 몰라

enter image description here

+1

가능한 경우 MigLayout을 사용하는 것이 좋습니다. 그렇지 않으면 일련의 복합 레이아웃 관리자를 사용해야합니다. – MadProgrammer

+0

@MadProgrammer는 아이디어에 대해 감사드립니다. GridBagLayout을 사용하여 레이아웃을 변경 했으므로 모든 것이 적합합니다. –

답변

0

이 진짜 대답이지만 질문에서 사포 할 더 나은 답변입니다!

레이아웃 관리자를 변경하여 문제가 해결되었습니다. 변경됨 그룹 레이아웃GridBagLayout입니다.

GridBagLayout gridBagLayout = new GridBagLayout(); 
     panel.setLayout(gridBagLayout); 

     gridBagLayout.rowHeights = new int[]{40, 40, 190, 190, 50}; 
     gridBagLayout.columnWidths = new int[]{40, 50, 70, 70, 700, 70, 50}; 

     panel.add(idTxt, newComponent(0, 0, 1, 1)); 

     panel.add(id, newComponent(1, 0, 1, 1)); 

     panel.add(pathTxt, newComponent(2, 0, 1, 1)); 

     panel.add(path, newComponent(3, 0, 1, 1)); 

     panel.add(new JLabel(""), newComponent(4, 0, 1, 1)); 

     panel.add(levelTxt, newComponent(5, 0, 1, 1)); 

     panel.add(level, newComponent(6, 0, 1, 1)); 

     panel.add(appellationTxt, newComponent(0, 1, 1, 1)); 

     panel.add(appellation, newComponent(1, 1, 6, 1)); 

     panel.add(scrollAreaDesc, newComponent(0, 2, 7, 1)); 

     panel.add(childrenTableScrollPane, newComponent(0, 3, 7, 1)); 

     panel.add(panelButtons, newComponent(0, 4, 6, 1)); 

그리고 newComponent :

private GridBagConstraints newComponent(int x, int y, int w, int h) { 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = y != 2 && y != 3 ? GridBagConstraints.HORIZONTAL : GridBagConstraints.BOTH; 
     c.gridx = x; 
     c.gridy = y; 
     c.gridwidth = w; 
     c.gridheight = h; 
     if (y == 2 || y == 3) { 
      c.weighty = 1.0; 
     } 
     if (x <=4 && (x + w) >=4) { 
      c.weightx = 1.0; 
     } 
     return c; 
    } 

감사의 레이아웃 매니저를 변경하는 아이디어에 대한 MadProgrammer 여기

새로운 코드입니다!