2017-11-18 157 views
1

我試圖做一個基本的登錄菜單下面這個模仿了起來:我不知道該擺的佈局,以及如何使用它來獲取我想要的模型

enter image description here

我決定把這個整個菜單進入一個JPanel,所以一旦連接成功,我可以切換到另一個面板。

因此,我決定使用Borderlayout在北部地區擁有標題,在南部地區擁有連接按鈕。

我做了borderlayout面板的中心本身。我決定將它作爲一個網格佈局,以便擁有標籤(登錄名,密碼)以及用戶放置其標識的文本字段。

結果是非常醜陋,從很遠的我的預期:

enter image description here

這是菜單的代碼:

public class EcranAccueil extends JPanel {  
    private JLabel labelTitre; 
    private JPanel PanelConnexion; 
    private JButton boutonConnexion;  
    private JLabel labelLogin; 
    private JLabel labelMotDepasse; 
    private JTextField loginUser; 
    private JTextField MotDepasseUser; 

    EcranAccueil(EcranGestion EcranPrincipale){ 
      PanelConnexion = new JPanel();  
      this.setLayout(new BorderLayout()); 
      PanelConnexion.setLayout(new GridLayout(2,2)); 
      loginUser = new JTextField("User"); 
      loginUser.setMinimumSize(new Dimension(20,20)); 
      loginUser.setMaximumSize(new Dimension(20,20)); 
      MotDepasseUser = new JTextField("Password"); 
      boutonConnexion = new JButton("Connect"); 
      boutonConnexion.setMinimumSize(new Dimension(200,200)); 
      boutonConnexion.setMaximumSize(new Dimension(200,200)); 
      labelTitre= new JLabel("ApplicationName"); 
      labelLogin= new JLabel("Login"); 
      labelMotDepasse = new JLabel("Password");   
      PanelConnexion.add(labelLogin); 
      PanelConnexion.add(loginUser); 
      PanelConnexion.add(labelMotDepasse); 
      PanelConnexion.add(MotDepasseUser); 
      this.add(labelTitre, BorderLayout.NORTH); 
      this.add(PanelConnexion, BorderLayout.CENTER);  
      this.add(boutonConnexion, BorderLayout.SOUTH); 
      }  } 

我試圖用一個gridboxlayout但我完全沒有使用它,它沒有編譯。有沒有人有建議或建議?

+1

如果您的代碼不起作用,請考慮爲其設置[mcve]。 – GhostCat

+1

請參閱此答案以瞭解如何處理佈局設計:https://stackoverflow.com/a/47121349/3992939 – c0der

+0

'我嘗試使用gridboxlayout' - 沒有這種佈局。使用適當的類名,讓人們知道你在說什麼。閱讀[佈局管理器]上的Swing教程(https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)以獲取工作示例以幫助您入門。如果需要實現佈局,也可以嵌套具有不同佈局管理器的面板。 – camickr

回答

2

解決複雜計算任務的常用策略是將它們分解爲小的,定義明確的可管理任務。分而治之。 這也適用於gui:將設計分解爲小型,易於佈置的容器。 在這種情況下,例如啓動通過將設計成3頃領域:

enter image description here

每個這樣的區域由嵌套面板實現。 正如你可以在代碼中看到,mainPanel被進一步分爲兩個嵌套的面板,以緩解和改善佈局:

class EcranAccueil extends JPanel { 

    EcranAccueil(){ 
     //Set layout (JPanel uses Flowlayout by default) 
     setLayout(new BorderLayout(5,5)); 

     // a nested panel for application label 
     JPanel topPanel = new JPanel(); 
     add(topPanel, BorderLayout.NORTH); 
     topPanel.setLayout(new FlowLayout(FlowLayout.LEADING));//set 

     JLabel labelTitre= new JLabel("ApplicationName"); 
     topPanel.add(labelTitre); 

     // a nested panel for login and password, having two rows 
     JPanel mainPanel = new JPanel(new GridLayout(2, 1)); 
     add(mainPanel, BorderLayout.CENTER); 

     JPanel loginPanel = new JPanel(); 
     loginPanel.setLayout(new FlowLayout(FlowLayout.TRAILING)); 
     mainPanel.add(loginPanel); 

     JLabel labelLogin = new JLabel("Login"); 
     loginPanel.add(labelLogin); 

     JTextField loginUser = new JTextField("User"); 
     loginUser.setColumns(10); 
     loginPanel.add(loginUser); 

     JPanel passwordPanel = new JPanel(); 
     passwordPanel.setLayout(new FlowLayout(FlowLayout.TRAILING)); 
     mainPanel.add(passwordPanel); 
     JLabel labelMotDepasse = new JLabel("Password"); 
     passwordPanel.add(labelMotDepasse); 
     JTextField motDepasseUser = new JTextField("Password"); 
     motDepasseUser.setColumns(10); 
     passwordPanel.add(motDepasseUser); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     add(buttonPanel,BorderLayout.SOUTH); 
     JButton boutonConnexion = new JButton("Connect"); 
     buttonPanel.add(boutonConnexion); 
    } 
} 

一旦你的基本思路,佈局和它的響應可以進一步提高。

相關問題