关于java中流失布局FlawLayout的问题,且看代码:
package GUI_Demo1;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.util.Scanner;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class GUIDC1 {
public static void main(String []args)
{
/*
* 为了方便以后需该,定义4个窗体大小的变量
* 分别是:jfx,jfy,jfw,jfh
*/
int jfx = 30, jfy = 30, jfwidth = 600, jfheight = 600 ;
JFrame jf = new JFrame();
jf.setBounds(jfx,jfy,jfwidth,jfheight);
//jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
JPanel jp = new JPanel() ;
jp.setBackground(Color.YELLOW);
jp.setBounds(jfx, jfy, jfwidth, jfheight); jf.add(jp);//为什么没有出现黄色?
JButton jb[] = new JButton[6];
for(int i=0; i<6; i++)
{
jb[i] = new JButton("流式布局按钮"+(i+1)) ;
}
for(int i=0; i<6; i++)
{
jp.add(jb[i]);
}
System.out.println("显示窗体请按[1],不显示请按[2]");
Scanner sa =new Scanner(System.in);
int sa_i = sa.nextInt();
boolean b = false ;
if( 1 == sa_i )
{
b = true ;
}else if( 2 == sa_i )
{
b = false ;
}else
{
System.out.println("你的输入不符合规范!");
}
jf.setVisible(b);
}
}
问题:
上面的代码里,我注释掉了jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));所以一切正常,为什么我不注释掉这一句,则整个主区域就不是黄色的了???我该怎么改???(注:修改的方法不要改掉我流式布局这一特点,因为正在学这里)
package GUI_Demo1;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.util.Scanner;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class GUIDC1 {
public static void main(String []args)
{
/*
* 为了方便以后需该,定义4个窗体大小的变量
* 分别是:jfx,jfy,jfw,jfh
*/
int jfx = 30, jfy = 30, jfwidth = 600, jfheight = 600 ;
JFrame jf = new JFrame();
jf.setBounds(jfx,jfy,jfwidth,jfheight);
//jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
JPanel jp = new JPanel() ;
jp.setBackground(Color.YELLOW);
jp.setBounds(jfx, jfy, jfwidth, jfheight); jf.add(jp);//为什么没有出现黄色?
JButton jb[] = new JButton[6];
for(int i=0; i<6; i++)
{
jb[i] = new JButton("流式布局按钮"+(i+1)) ;
}
for(int i=0; i<6; i++)
{
jp.add(jb[i]);
}
System.out.println("显示窗体请按[1],不显示请按[2]");
Scanner sa =new Scanner(System.in);
int sa_i = sa.nextInt();
boolean b = false ;
if( 1 == sa_i )
{
b = true ;
}else if( 2 == sa_i )
{
b = false ;
}else
{
System.out.println("你的输入不符合规范!");
}
jf.setVisible(b);
}
}
问题:
上面的代码里,我注释掉了jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));所以一切正常,为什么我不注释掉这一句,则整个主区域就不是黄色的了???我该怎么改???(注:修改的方法不要改掉我流式布局这一特点,因为正在学这里)
package GUI_Demo1;import java.awt.Color;
import java.awt.FlowLayout;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class GUIDC1 { public static void main(String[] args) {
/*
* 为了方便以后需该,定义4个窗体大小的变量
* 分别是:jfx,jfy,jfw,jfh
*/
int jfx = 30, jfy = 30, jfwidth = 600, jfheight = 600;
JFrame jf = new JFrame();
jf.setBounds(jfx, jfy, jfwidth, jfheight);
jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
jf.getContentPane().setBackground(Color.YELLOW);
JPanel jp = new JPanel();
jp.setOpaque(false);
// jp.setBackground(Color.YELLOW);
// jp.setBounds(jfx, jfy, jfwidth, jfheight); jf.add(jp);//为什么没有出现黄色? JButton jb[] = new JButton[6];
for(int i = 0; i < 6; i++) {
jb[i] = new JButton("流式布局按钮" + (i + 1));
}
for(int i = 0; i < 6; i++) {
jp.add(jb[i]);
} System.out.println("显示窗体请按[1],不显示请按[2]");
Scanner sa = new Scanner(System.in);
int sa_i = sa.nextInt();
boolean b = false;
if( 1 == sa_i )
b = true;
else if( 2 == sa_i )
b = false;
else
System.out.println("你的输入不符合规范!");
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jf.setVisible(b);
}
}
1、你设置的是jf.getContentPane().setBackground(Color.YELLOW);
而我之前自己设置jf.setBackgound(Color.YELLOW)却一点变化都没有,这是为什么?
2、我发现你设置了jp.setOpaque(false),我发现Opaque的中文翻译为:不透明的,你这样子做是否是使得jp(也就是我定义的JPanel)无效?
3、你定义了jp.setOpaque(false),于是你注释掉了我的
// jp.setBackground(Color.YELLOW);
// jp.setBounds(jfx, jfy, jfwidth, jfheight);
这两条代码,你注释掉了。
但我想问的是,我明明在定义的jp(也就是JPanel)后,设置jp的坐标以及大小都和jf(也就是JFrame)一样大,怎么就因为我有定义了几个JButton而只有一个小小的颜色点?
--------------
望指教,谢谢!
主要是 LayoutManager 的问题。第一个需要注意的问题是,jf.add(...) 其实是相当于 jf.getContentPane().add(...)。jf.getContentPane() 返回类型是 Container, 是 JFrame 默认带有的一个添加控件的层面,它的具体类型,其实就是一个 JPanel,默认的 LayoutManager (也就是如果你调用 getLayout() 的话,返回的) 是 BorderLayout。当你调用 jf.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
的时候,其实就是 jf.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER,10,10));这个添加控件的层面的 LayoutManager 成了 FlowLayout。使用了 Flowlayout 的 Container 上摆放子控件的时候,尊重的是子控件的 getPreferredSize()。而你要添加的 jp 本身,是这样的: JPanel jp = new JPanel();默认的 JPanel,默认的 LayoutManager 也是 FlowLayout,里面又添加了一些按钮。这个 jp 在你没有手动设置 setPreferredSize(Dimension) 的情况下,表现出来的 getPreferredSize() 就是它自带的 FlowLayout 摆放完其内部所有按钮以后需要的大小。你的 jp.setBounds() 在 jp 的父控件( jf.getContentPane() ) 设置了 FlowLayout 的情况下,是不起作用的。 FlowLayout 在 jf.getContentPane() 每次 validate 的时候都会根据 FlowLayout 的规则设置其所有直属子控件的 setBounds(),覆盖掉你的设置。
简单的说,在你使用了 LayoutManager 的情况下,子控件的 setBounds() 不起作用,具体的 LayoutManager 的摆放规则起作用,对于 FlowLayout 来说,它除了本身排列子控件的规则之外,还尊重每一个子控件的 getPreferredSize()。