关于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));所以一切正常,为什么我不注释掉这一句,则整个主区域就不是黄色的了???我该怎么改???(注:修改的方法不要改掉我流式布局这一特点,因为正在学这里)

解决方案 »

  1.   


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

  2.   

    朋友,我注意到你做了以上几步的添加,使得我的框架出现黄色了!能否简单解释下我几个疑惑?
    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而只有一个小小的颜色点?
    --------------
    望指教,谢谢!
      

  3.   


    主要是 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()。