2014-07-07 26 views
0

我创建了两个方法,其参数为BorderLayout,其他为FlowLayout,每种方法都有自己的框架。边框和流布局不显示两个窗口?

但只有一个窗口弹出混合布局。

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 

public class BLayOut extends JFrame 
{ 
private JFrame fr,fr2; 
private JLabel label,label2,label3; 

public void win(BorderLayout bl) 

{ 
fr =new JFrame("BorderLayout"); 

setSize(300,200); 
setVisible(true); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 


setLayout(bl); 

label= new JLabel("Label 1"); 
label2 = new JLabel("Label 2"); 
label3 = new JLabel("Label 2"); 
add(label,BorderLayout.NORTH); 
add(label2,BorderLayout.SOUTH); 
add(label3,BorderLayout.CENTER); 

} 

public void win(FlowLayout fl) 
{ 
fr2 =new JFrame("FlowLayout"); 
setSize(500,200); 
setVisible(true); 
setLocation(300, 0); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 


setLayout(fl); 

label= new JLabel("Label 1"); 
label2 = new JLabel("Label 2"); 
label3 = new JLabel("Label 3"); 
add(label); 
add(label2); 
add(label3); 

} 


} 

class BLayOutMain 
{ 
    public static void main (String args []) 
    { 
     BLayOut bl = new BLayOut(); 
     bl.win(new BorderLayout()); 
     bl.win(new FlowLayout()); 
    } 
} 

回答

1

你混淆了你的参考...

首先,创建从JFrame延伸的类...

public class BLayOut extends JFrame { 

然后你声明的JFrame两个实例变量。 ...

private JFrame fr, fr2; 

然后在您的方法中,您将创建一个的实例并将其分配给这些变量中的一个,并及时忽略他们...

fr = new JFrame("BorderLayout"); 

// Which frame are you modifying now...?? 
setSize(300, 200); 
setVisible(true); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 

setLayout(bl); 

label = new JLabel("Label 1"); 
label2 = new JLabel("Label 2"); 
label3 = new JLabel("Label 2"); 
add(label, BorderLayout.NORTH); 
add(label2, BorderLayout.SOUTH); 
add(label3, BorderLayout.CENTER); 

基本上,这是什么东西做的是设置的BLayOut实例的属性,而不是frfr2

首先从BLayOut中删除extends JFrame,这会混淆问题,这将生成一个编译器错误列表,其中找不到方法。这些可以通过使用frfr2,根据不同的方法来固定...

fr = new JFrame("BorderLayout"); 

// Which frame are you modifying now...?? 
fr.setSize(300, 200); 
fr.setVisible(true); 
fr.setDefaultCloseOperation(EXIT_ON_CLOSE); 

fr.setLayout(bl); 

fr.label = new JLabel("Label 1"); 
fr.label2 = new JLabel("Label 2"); 
fr.label3 = new JLabel("Label 2"); 
fr.add(label, BorderLayout.NORTH); 
fr.add(label2, BorderLayout.SOUTH); 
fr.add(label3, BorderLayout.CENTER); 

你真的应该只调用setVisible当您准备好显示初始化UI

fr = new JFrame("BorderLayout"); 
//... 
fr.setVisible(true); 

这样,您的用户界面将显示,而不需要以某种方式revalidate框架...

+0

或者我可以jsut创建另一个实例BLayOut BL = new BLayOut(); BLayOut b2 = new BLayOut(); bl.win(new BorderLayout()); b2.win(new FlowLayout());但不知道这是个好主意。 – mhrzn

+0

@mhrzn我假设这是一个测试,所以无论哪种方式应该能够工作,我只是有个人厌恶从'JFrame'扩展 – MadProgrammer