Java组件替换JPanel

时间:2017-02-28 16:19:40

标签: java swing layout interface

我正在尝试用3个部分创建一个应用程序:3个标签和3个网格布局。当我们点击标签时,相应的gridlayout消失,框架自动替换正确位置的组件。我创建了一个简单的代码段:

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

第一个问题是使用全局gridlayout来调整相同大小的所有组件,但我认为如果标签小于grilayouts会更好。

第二个问题是即使删除了gridlayout或setVisible(false),它仍然在全局容器中占据空白位置。

我得到了什么:

enter image description here

我的期待:

enter image description here

我唯一不想使用的是GridBagLayout。

我正在考虑创建一个方法init(),其中一个删除全局容器的所有组件然后重新添加所有标签和所有面板,然后创建另一个方法,它与init()方法完全相同但是数字作为参数(例如2)然后重新添加除第二个gridlayout之外的所有组件。但我觉得这样做是一种肮脏的方式,因为容器会在最后满足一个空盒子,我认为有一种比移除和重新添加所有组件更好的方法(这基本上不能解决标签大小的第一个问题) )

我该如何避免这些问题?

1 个答案:

答案 0 :(得分:3)

尝试使用垂直BoxLayout

阅读How to Use BoxLayout上Swing教程中的部分,了解更多信息和工作示例。