2017-11-18 185 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); 
    } 
} 

一旦你的基本思路,布局和它的响应可以进一步提高。

相关问题