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

Layouts работают легче, когда вы разбиваете макет на логические панели, а затем устанавливаете панели с разными менеджерами компоновки.

Например, в качестве содержимого панели вкладок используйте панель с 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);

вы жестко прописывать пиксельную ширину пространства между компонентами, которые не будут работать через широкое разнообразие современных экранов.

При заказе следует выбрать либо GroupLayout, либо MigLayout.

Вот пример с менеджером MigLayout. Обратите внимание, как легко - это создать макет с этим менеджером. (Четыре строки кода.) Кроме того, вместо физических пикселей мы используем логические пиксели (lp).

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

А вот скриншот:

Screenshot of the code example

Смежные вопросы