zoukankan      html  css  js  c++  java
  • 转:javax.swing.JFrame中使用jpanel来布局

    通俗的讲jframe相当与桌子,而jpanel相当桌布,jbutton,jlabel等相当于杯子,碗筷等,杯子,碗筷虽然可以直接放到桌子上但不是很规范,应该放到桌布上才对。
    以前我没有用jpanel来布局。直接就是jframe.add(jlabel1);然后就是jlabel1.setbound();这种做法不妥,虽然窗口可以正常显示,但是还是不规范,有事后会有点小问题,当组件更改的时候会有点问题,会有阴影(以前遇到过这种问题)。

    正确的做法是
    1.使用Container content=this.getContentPane();得到容器
    2.实例化一个jpanel 例如JPanel  panel1=new   javax.swing.JPanel();
    3.实例化组件比如JButton等
    4.使用panel1.add()方法添加组件
    5.定位比如说JButton1.setbound(0,0,23,34);注意这里的坐标是相对于其所在的容器panel1
    6.使用例如content.add(panel,BorderLayout.CENTER);方法把“桌布”(panel1)放到“桌子”content上。(JFrame的默认布局是BorderLayout)

    示例代码如下:

    1: import java.awt.BorderLayout;
    2: import java.awt.Color;
    3: import java.awt.Container;
    4: import javax.swing.JButton;
    5: import javax.swing.JFrame;
    6: import javax.swing.JPanel;
    7: public class NewClass extends JFrame {
    8:  /** Creates a new instance of NewClass */
    9:  public NewClass() {
    10:   init();
    11:  }
    12:  public void init() {
    13:   // 实例化JPanel等一些组件
    14:   JPanel pan1 = new JPanel();
    15:   JButton jb1 = new JButton("one in pan1");
    16:   JButton jb2 = new JButton("two in pan1");
    17:   JButton jb3 = new JButton("one out panel");
    18:   JButton jb4 = new JButton("two out panel");
    19:   // setBound()坐标是相对于pan1而言的
    20:   jb1.setBounds(0, 0, 100, 30);
    21:   jb2.setBounds(0, 200, 100, 30);
    22:   // 得到容器为什么不需要实例化?可能是因为每个窗口都有这个对象
    23:   Container cont = getContentPane();
    24:   // 将pan1添加到容器中
    25:   cont.add(pan1, BorderLayout.CENTER);
    26:   cont.add(jb4, BorderLayout.WEST);
    27:   cont.add(jb3, BorderLayout.EAST);
    28:   // 将组件添加到pan1中,并对pan1做一些初始化
    29:   pan1.setLocation(70, 70);
    30:   pan1.setLayout(null);//注意此处的null
    31:   pan1.add(jb1);
    32:   pan1.add(jb2);
    33:   pan1.setBackground(Color.ORANGE);
    34:   this.setBounds(0, 0, 400, 400);
    35:   this.setVisible(true);
    36:  }
    37:  public static void main(String arg[]) {
    38:   NewClass test = new NewClass();
    39:  }
    40: }
    问题1:做窗口程序时候Container cont=getContentPane(); cont.add(pan1,BorderLayout.CENTER);//如何定位pan1位置?如何把pan1放到指定的坐标?
      答:可以使用pan1.setbound()方法,相应的要设置cont.setLayout(null);    注意JPanel的默认布局是FlowLayout
      如果没有设置cont.setLayout(null);系统会使用默认的布局管理器,那么pan1.setbound()就不会起作用,比如说上例cont没有设置布局管理器为空。
      容器包含关系JFrame=》  Container=》JPanel=》(各种组件)

    个人心得:

    我们要建一个JFrame,里面包含一个JPanel,JPanel里面有几个JButton。

    public class JFrameContainJPanel {
        public static void main(String[] args)
        {
            JFrame jf=new JFrame("Frame");
            JPanel jpanel=new JPanel();
            jpanel.setLayout(null);
            
            Container c=jf.getContentPane();
            //c.add(jpanel,BorderLayout.CENTER);
            jf.setLayout(null);
            c.add(jpanel);
            
            JButton bt1,bt2,bt3;
            bt1=new JButton("Button1");
            bt2=new JButton("Button2");
            bt3=new JButton("Button3");
            
            bt1.setBounds(10,10,80,20);
            bt2.setBounds(10,50,80,20);
            bt3.setBounds(10,90,80,20);
            
            jpanel.add(bt1);
            jpanel.add(bt2);
            jpanel.add(bt3);
            
            jpanel.setBackground(Color.blue);
            //jpanel.setLocation(70,70);
            
            jf.setBounds(0,0,800,600);
            
            jpanel.setBounds(50,0,750,600);
                
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
             }
    
    }

    显示如下:

    我们将JFrame(默认BorderLayout),JPanel(默认FlowLayout)

       都设为setLayout(null);

    jpanel.setBounds(50,0,750,600); 使JPanel在JFrame的右端。

    public void setBounds(int x,
                          int y,
                          int width,
                          int height)
    移动组件并调整其大小。由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
    public void setLocation(Point p)
    将组件移到新位置。通过点 p 来指定新位置的左上角。在父级坐标空间中给出点 p
    参数:
    p - 定义新位置左上角的点,在此组件的父级坐标空间中给出

    这2个方法都是JComponent的方法。

  • 相关阅读:
    html_dom类读取
    PHPExcel读取Excel文件的实现代码
    PHP中的mb_convert_encoding与iconv函数介绍
    BZOJ 3160 万径人踪灭 解题报告
    BZOJ 4036 [HAOI2015] Set 解题报告
    BZOJ 3288 Mato矩阵 解题报告
    BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告
    BZOJ 4123 [Baltic2015] Hacker 解题报告
    BZOJ 4127 Abs 解题报告
    BZOJ 4145 [AMPPZ2014] The Prices 解题报告
  • 原文地址:https://www.cnblogs.com/youxin/p/2772540.html
Copyright © 2011-2022 走看看