2014-07-07 5 views
0

그래서 이미지에서 보이는 것을 생성하는 다음 Java 코드가 있습니다. 레이아웃은 단추가 동일한 크기로 채워지고 채워지는 것을 제외하고는 내가 원했던 것입니다. 어쨌든 다른 답변처럼 GridBagLayout을 사용하지 않고 이것을 피할 수 있습니까? 나는 내부의 패널 크기를 더 작게 설정하려고 시도했지만 어쨌든 늘어났다.Java Swing GridLayout가 늘어 났습니까?

코드 :

//Set-up main window 
    JFrame mainwindow = new JFrame(); 
    mainwindow.setSize(500, 500); 
    mainwindow.setTitle("Example"); 

    //Add components 
    JTabbedPane tabs = new JTabbedPane(); 

    GridLayout experimentLayout = new GridLayout(0,2,0,5); 
    JPanel pnl_Logon = new JPanel(); 
    pnl_Logon.setLayout(experimentLayout); 
    JLabel lbl_Username = new JLabel("Username: "); 
    JLabel lbl_Password = new JLabel("Password: "); 
    JTextField txt_Username = new JTextField(10); 
    JPasswordField psw_Password = new JPasswordField(10); 
    JButton btn_Logon = new JButton("Logon"); 
    JButton btn_Clear = new JButton("Clear"); 
    pnl_Logon.add(lbl_Username); 
    pnl_Logon.add(txt_Username); 
    pnl_Logon.add(lbl_Password); 
    pnl_Logon.add(psw_Password); 
    pnl_Logon.add(btn_Logon); 
    pnl_Logon.add(btn_Clear); 

    tabs.addTab("Logon", pnl_Logon); 

    //Draw window 
    mainwindow.add(tabs); 
    mainwindow.show(); 

결과 : 이유

Java Layout

+0

레이아웃 홀수 보이지만 (GridBagLayout을 비교)은 "간단한"용액 각각이 FlowLayout의 JPanel의 버튼으로 포장 될 수있다. – Marco13

+0

그래서 각 버튼은 자체 레이아웃의 JPanel에 배치됩니까? 그런 다음 탭에 추가 할 다른 JPanel에 각 구성 요소를 추가하겠습니까? – Kyle

+1

[MigLayout] (http://www.miglayout.com/) – PeterMmm

답변

1

GridLayout 관리자가 그 아이의 최소, 바람직하고, 최대 크기 값을 준수하지 않습니다. GridLayout에있는 모든 셀의 크기는 같습니다. 각 셀의 크기는 가장 큰 구성 요소가있는 셀의 크기와 같습니다. 매우 유용한 관리자는 아니며 실제 응용 프로그램에서 거의 사용할 수 없습니다. 하지만 혼란을 일으키는 것 같습니다.

GridBagLayout 관리자는 피하기를 원했습니다. 그러나 거기에 다른 많은 옵션이 있습니다. 이러한 종류의 레이아웃은 유연한 관리자 인 을 통해 쉽게 달성 할 수 있습니다.

나는 관리자가 MigLayout 인 간단한 솔루션을 제공합니다. MigLayout은 그리드 기반 레이아웃 관리자이기도하며 이런 종류의 레이아웃은 몇 줄에 쉽게 생성 할 수 있습니다.

package com.zetcode; 

import java.awt.EventQueue; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import net.miginfocom.swing.MigLayout; 



public class MigLayoutLogin extends JFrame { 

    public MigLayoutLogin() { 

     initUI(); 

     setTitle("Log in"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
    } 

    private void initUI() { 

     setLayout(new MigLayout("ins 15")); 


     add(new JLabel("User name:")); 
     add(new JTextField(10), "pushx, growx, wrap"); 
     add(new JLabel("Password: ")); 
     add(new JPasswordField(10), "growx, wrap"); 

     add(new JButton("Log in"), "span 2, split 2, center, gaptop 15"); 
     add(new JButton("Log out")); 

     pack(); 
    }  


    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       MigLayoutLogin ex = new MigLayoutLogin(); 
       ex.setVisible(true); 
      } 
     }); 
    }   
} 

이 레이아웃이 얼마나 정확한지 알 수 없으므로 직접 작성했습니다. 텍스트 필드가 가로 방향으로 커지고 두 개의 버튼이 가운데에 맞춰진 입니다.

Log in

2

setSize()이 방법을 사용하지 않는, here을 언급했다. 대신 각 구성 요소에 선호 크기를 적용하고 pack()을 묶는 부분은 Window입니다. 이 경우 이 기본 크기 인 패널에 각 버튼을 추가하십시오 (그림은 here).

image