2017-11-18 18 views
1

내 원하는 모델을 얻기 위해 그것을 사용하는 : 나는에이 모든 메뉴를 넣어하기로 결정내가하는 스윙 레이아웃을 잘 모릅니다 방법 I가이 모의 다음과 같은 기본 로그인 메뉴를 만들기 위해 노력하고

enter image description here

JPanel 그래서 연결이 성공하면 다른 패널로 전환 할 수 있습니다.

그래서 Borderlayout을 사용하여 북쪽 영역의 제목과 남쪽 영역의 연결 버튼을 사용하기로 결정했습니다.

저는 경계면의 중심을 패널 자체로 만들었습니다. 나는 라벨 (로그인, 패스워드)뿐만 아니라 사용자가 자신의 ID를 넣을 텍스트 필드를 갖기 위해 그리드 레이아웃을 만들기로 결정했다.

결과는 아주 못생긴과 멀리에서 내가 기대했던 :

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을 사용하려고하지만 완전히 : 여기

enter image description here

메뉴의 코드 사용에 실패하여 컴파일되지 않았습니다. 누구에게 조언이나 제안이 있습니까?

+1

작동하지 않는 코드가있을 경우 [mcve]를 사용하는 것이 좋습니다. – GhostCat

+1

레이아웃 디자인을 처리하는 방법은이 답변을 참조하십시오. https://stackoverflow.com/a/47121349/3992939 – c0der

+0

'gridboxlayout을 사용하려했습니다.'- 레이아웃이 없습니다. 사람들이 당신이 말하는 것을 알 수 있도록 적절한 클래스 이름을 사용하십시오. 시작하기위한 실제 예제는 [레이아웃 관리자] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)의 스윙 튜토리얼을 읽으십시오. 레이아웃을 달성하는 데 필요한 경우 다른 레이아웃 관리자로 패널을 중첩 할 수도 있습니다. – camickr

답변

2

복잡한 컴퓨팅 작업을 해결하는 일반적인 전략은 작고 잘 정의 된 관리 가능한 작업으로 나누는 것입니다. 분열하고 정복하십시오. 이것은 gui에도 적용됩니다. 작고 쉬운 레이아웃 컨테이너로 디자인을 분리하십시오. 이 경우 는 예컨대 3아르 영역으로 설계를 분할함으로써 시작 :

enter image description here

이러한 각 영역은 중첩 된 패널에 의해 구현된다. 당신이 기본적인 아이디어를 얻을 일단

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); 
    } 
} 

가, 레이아웃 및 응답 성이 더욱 향상 될 수있다 당신이 코드에서 볼 수 있듯이, mainPanel 더 완화 및 레이아웃을 개선하기 위해, 두 개의 중첩 패널로 나누어 져 있습니다.