2016-11-01 2 views
0

두 개의 jpanels : jpanel1 및 jpanel2는 내용에 따라 정확한 최소 크기를 가져야합니다. jpanel0은이 두 패널의 컨테이너이며, 프레임의 왼쪽에 있어야합니다. 그리고 여기에는 오른쪽에 사용 가능한 공간의 나머지 부분을 차지하는 jpanel3이 있습니다.jpanels의 크기를 올바르게 설정하는 방법은 무엇입니까?

사용 가능한 모든 공간에 jpanel의 크기를 설정하는 방법은 무엇입니까?

내 원하는 출력 : enter image description here

내 전류 출력 : enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

public class Panels { 

public static void main(String[] args) { 

    JFrame myFrame = new JFrame(); 
    myFrame.setLayout(new BorderLayout()); 

    JTabbedPane jtp = new JTabbedPane(); 

    JPanel jPaneTab1 = new JPanel(); 
    jPaneTab1.setLayout(new FlowLayout(FlowLayout.LEFT)); 

    JPanel jpanel0 = new JPanel(); 
    jpanel0.setLayout(new BoxLayout(jpanel0, BoxLayout.Y_AXIS)); 
    jpanel0.setBorder(BorderFactory.createTitledBorder("jpanel0")); 
    jpanel0.setBackground(Color.RED); 


    JPanel jpanel1 = new JPanel(); 
    jpanel1.setLayout(new GridBagLayout()); 
    jpanel1.setBorder(BorderFactory.createTitledBorder("jpanel1")); 
    GridBagConstraints gc = new GridBagConstraints(); 
    jpanel1.setBackground(Color.BLUE); 

    JLabel jlabel1 = new JLabel("jlabel1"); 
    gc.gridx = 0; 
    gc.gridy = 0; 
    gc.anchor = GridBagConstraints.NORTHWEST; 
    gc.insets = new Insets(0, 0, 0, 2); 
    jpanel1.add(jlabel1, gc); 
    JLabel jlabel2 = new JLabel("jlabel2"); 
    gc.gridx = 0; 
    gc.gridy = 1; 
    gc.anchor = GridBagConstraints.NORTHWEST; 
    gc.insets = new Insets(0, 0, 0, 2); 
    jpanel1.add(jlabel2, gc); 


    JPanel jpanel2 = new JPanel(); 
    jpanel2.setLayout(new GridBagLayout()); 
    jpanel2.setBorder(BorderFactory.createTitledBorder("jpanel2")); 
    GridBagConstraints gc2 = new GridBagConstraints(); 
    jpanel1.setBackground(Color.BLUE); 

    JLabel jlabel3 = new JLabel("jlabel3"); 
    gc2.gridx = 0; 
    gc2.gridy = 0; 
    gc2.anchor = GridBagConstraints.NORTHWEST; 
    gc2.insets = new Insets(0, 0, 0, 2); 
    jpanel2.add(jlabel3, gc2); 
    JLabel jlabel4 = new JLabel("jlabel4"); 
    gc2.gridx = 0; 
    gc2.gridy = 1; 
    gc2.anchor = GridBagConstraints.NORTHWEST; 
    gc2.insets = new Insets(0, 0, 0, 2); 
    jpanel2.add(jlabel4, gc2); 






    JPanel jpanel3 = new JPanel(); 
    jpanel3.setBackground(Color.YELLOW); 
    JLabel jlabel5 = new JLabel("jpanel3"); 
    jpanel3.add(jlabel5); 

    jpanel0.add(jpanel1); 
    jpanel0.add(jpanel2); 
    jPaneTab1.add(jpanel0, BorderLayout.WEST); 
    jPaneTab1.add(jpanel3, BorderLayout.CENTER);   

    JPanel jPaneTab2 = new JPanel(); 


    jtp.addTab("tab1", jPaneTab1); 
    jtp.addTab("tab2", jPaneTab2); 

    myFrame.add(jtp);  
    myFrame.setSize(800, 600); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myFrame.setVisible(true); 
} 

} 

추가 :

내가 또 다른 문제를 얻고 주 (탭 패널)에 대한의 BorderLayout을 사용하는 경우 : enter image description here

답변

2

레이아웃을 논리 패널로 분해 한 다음 다른 레이아웃 관리자로 패널을 중첩하면 레이아웃이 더 쉽게 작동합니다.

예를 들어, 탭 패널의 내용으로 BorderLayout이있는 패널을 사용하십시오.

그런 다음 당신은 "타고 측면 패널"을 생성하고이 패널과 "센터 패널"그럼

JPanel main = new JPanel(new BorderLayout()); 
JPanel rightSide = new JPanel(...); 
JPanel center = new JPanel(...); 
main.add(rightSide, BorderLayout.LINE_START); 
main.add(center, BorderLayout.CENTER); 

는 "rightSide"에 대한 레이아웃을 설정하고에 추가 "센터"패널 및 구성 요소를 추가 각 패널에.

2

GridBagLayout, BorderLayout 또는 BoxLayout 관리자를 사용하면 안됩니다. 이들은 90 년대의 오래된 관리자입니다. 예를 들어

,이 할 : 당신이 오늘의 스크린의 다양한에서 작동하지 않습니다 구성 요소 사이의 픽셀 폭의 공간을 하드 코딩하는

gc.insets = new Insets(0, 0, 0, 2);

합니다.

Insted에서는 GroupLayout 또는 MigLayout 중 하나를 선택해야합니다.

다음은 관리자 MigLayout의 작동 예제입니다. 이이 관리자로 레이아웃을 만드는 것이 얼마나 쉬운 지 주목하십시오. (4 줄의 코드) 또한 물리적 픽셀 대신 논리 픽셀 (lp)을 사용합니다.

Screenshot of the code example

: 여기
package com.zetcode; 

import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import net.miginfocom.swing.MigLayout; 

public class PanelsEx extends JFrame { 

    public PanelsEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTabbedPane tabpane = new JTabbedPane(); 

     JPanel mainPanel = new JPanel(); 

     JPanel pnl1 = createPanel("Panel 1"); 
     JPanel pnl2 = createPanel("Panel 2"); 
     JPanel pnl3 = createPanel("Panel 3");   

     mainPanel.setLayout(new MigLayout("ins 10lp")); 

     mainPanel.add(pnl1, "w 150lp, h 100lp, split 2, flowy, ay top"); 
     mainPanel.add(pnl2, "w 150lp, h 100lp"); 
     mainPanel.add(pnl3, "push, grow"); 

     tabpane.add("First", mainPanel); 

     add(tabpane); 

     pack();   

     setTitle("Panels"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    private JPanel createPanel(String text) { 

     JLabel lbl = new JLabel(text); 
     JPanel pnl = new JPanel(); 
     pnl.add(lbl); 

     pnl.setBorder(BorderFactory.createEtchedBorder()); 

     return pnl; 
    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(() -> { 
      PanelsEx ex = new PanelsEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

그리고

는 스크린 샷입니다
관련 문제