我试图在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),它仍然占用全局容器中的空白位置。
我得到什么:
我所期待的:
我唯一不想使用是GridBagLayout的。
我在想创建一个init()方法,它删除全局容器的所有组件,然后重新添加所有标签和所有面板,然后创建另一个方法,它与init()方法完全相同,但是以数字作为参数(例如2),然后重新添加除第二个网格布局外的所有组件。但我认为这是一种肮脏的方式,因为容器最后会包含一个空白的案例,我认为有比删除和重新添加所有组件更好的方法(这基本上不能解决标签大小的第一个问题)
我该如何避免这些问题?
这个问题太广泛了 – ControlAltDel
基本上我期待一个提示,使用另一种布局,可以更好地适应我的问题,而不是GridLayout,并避免使用GridBagLayout –
太难回答这样一个广泛的问题。提示:BoxLayout? –