2017-02-28 93 views
-1

我试图在3个部分创建应用程序:3个标签和3个gridlayouts。当我们点击一​​个标签时,相应的网格布局消失,框架会自动替换正确位置的组件。我创建了一个简单的片断:Java组件替换JPanel

import java.awt.Button; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class TestLayout extends JFrame{ 
    private JPanel content; 
    private JLabel[] lbl; 
    private JPanel[] pnl; 
    private Boolean[] ih; 

    public TestLayout(){ 
     setTitle("Test"); 
     setSize(new Dimension(300, 400)); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     lbl = new JLabel[3]; 
     pnl = new JPanel[3]; 
     ih = new Boolean[3]; 

     content = new JPanel(new GridLayout(6, 1)); 
     for(int i=0; i<3; i++){ 
      lbl[i] = new JLabel("Label" + i); 
      lbl[i].addMouseListener(new MouseAdapter() 
      { 
       public void mouseClicked(MouseEvent e) 
       { 
        for(int i=0; i<3; i++){ 
         if(e.getSource() == lbl[i]){ 
          //pnl[i].setVisible(!pnl[i].isVisible()); 
          if(ih[i]) content.remove(pnl[i]); 
          else content.add(pnl[i]); 
          ih[i] = !ih[i]; 
         } 
        } 

       } 
      }); 
      pnl[i] = new JPanel(new GridLayout(3, 3)); 
     } 

     for(int i=0; i<9; i++){ 
      pnl[0].add(new Button("" + (i+1))); 
      pnl[1].add(new Button("" + (i+10))); 
      pnl[2].add(new Button("" + (i+19))); 
     } 

     for(int i=0; i<3; i++){ 
      content.add(lbl[i]); 
      content.add(pnl[i]); 
      ih[i] = true; 
     } 

     add(content); 
     setVisible(true); 
    } 
    public static void main(String[] args){ 
     new TestLayout(); 
    } 
} 

的第一个问题是使用全球网格布局调整其所有组件以相同大小的,但我认为它会更好,如果标签可能比grilayouts小。

第二个问题是,即使gridlayout被移除或setVisible(false),它仍然占用全局容器中的空白位置。

我得到什么:

enter image description here

我所期待的:

enter image description here

我唯一不想使用是GridBagLayout的。

我在想创建一个init()方法,它删除全局容器的所有组件,然后重新添加所有标签和所有面板,然后创建另一个方法,它与init()方法完全相同,但是以数字作为参数(例如2),然后重新添加除第二个网格布局外的所有组件。但我认为这是一种肮脏的方式,因为容器最后会包含一个空白的案例,我认为有比删除和重新添加所有组件更好的方法(这基本上不能解决标签大小的第一个问题)

我该如何避免这些问题?

+1

这个问题太广泛了 – ControlAltDel

+0

基本上我期待一个提示,使用另一种布局,可以更好地适应我的问题,而不是GridLayout,并避免使用GridBagLayout –

+0

太难回答这样一个广泛的问题。提示:BoxLayout? –

回答

3

尝试使用垂直BoxLayout

有关更多信息和工作示例,请参阅How to Use BoxLayout上的Swing教程部分。

+0

看起来这正是我在找的东西,谢谢! –