实现JAVA手动布局中各个组件能随窗口变化的方法 毛永恒,2004-8-9,贵州大学计算机科学系 用JAVA编程的人也许都遇到过这样的情况,当用手动布局做出一个界面时,各个组件不能随窗口随意变化大小。但改用自动布局后又特别的麻烦,有时为了一个按钮的位置需要做非常复杂的设计,最终效果仍不尽人意。 那么有没有什么方法能使用手动布局的组件可以随着窗口的变化而随意的变化呢?本人用Frame的componentResized事件实现手动布局,不仅组件可以随着窗口的变化而变化,而且思路清晰,布局灵活,代码少,只需用几句程序就可以解决问题。 先看下图: http://www./members/{毛永恒}/images/java.gif 上图模拟一个对数据库内容增删改查的界面,红色为条件选择区域,橙色为程序功能区,表格为数据区。程序在JBuilder 9下编辑和运行。 首先,建一个frame文件(Application应用程序),在Design中将this中的layout设置为null(不要布局器); 第 二,在组件盘内点选Swing Container页签,选取Jpanel图标,在this上方拖拽一块区域,同样的方法在下方也拖拽一块区域,为了方便 区分,将上方的Jpanel1区域设置为红色,下方的Jpanel2区域设置为橙色。将Jpanel1和Jpanel2的layout设置为null(不 要布局器)。 第三,在Jpanel中放入一个Jlable标题栏,JTextField1文本框和Jbutton按钮,在组件盘内点选 Swing 页签,选取JLable图标在Jpanel1的左边画一个标题栏,将text改为“请输入查询条件”,再选取JtextField在 Jpanel1的中间画一个文本框,将text改为空,最后选取Jbutton在Jpanel1又边画一个按钮将text改为“查询”。在Jpanel2 中画三个Jbutton按钮,将text分别设为“增加”、“删除”、“修改”。 第四,在this的中间建一个表格用来显示数据库数据的内容,在 Swing Container页签,选取jScrollPane图标,在this的中间拖拽一个大的区域,接着在组件盘内点选Swing 页签,选取 JTable图标,将Jtable加入到jScrollPane中。 这样我的界面就做好了,但这个界面不能随窗口自动调整大小。下面编程实现手动布局,使各区域能随窗口自动调整大小。 先用鼠标选中this窗体,再选择右边的事件Events中的componentResized,双击鼠标就进到void this_componentResized(ComponentEvent e) {}中,在{}中写入下列代码: //设置jPanel1的起点坐标 jPanel1.setLocation(0,0); //设置jPanel1的高度和宽度 jPanel1.setSize(this.getWidth(),jPanel1.getHeight()); //设置jPanel2的起点坐标(37是标题栏的高度) jPanel2.setLocation(0,this.getHeight()-jPanel2.getHeight()-37); //设置jPanel1的高度和宽度 jPanel2.setSize(this.getWidth(),jPanel2.getHeight()); //设置jScrollPanel的起点坐标 jScrollPane1.setLocation(0,jPanel1.getHeight()); //设置jScrollPanel的高度和宽度 jScrollPane1.setSize(this.getWidth(),jPanel2.getY()-jPanel1.getHeight()); 本程序只调整了Jpanel1、Jpanel2和JScrollPane1随窗口变化,同样的方法,可以使按钮、文本框等一起随窗口变化。 程序在“查询”按钮事件中模拟从数据库中取数据,并显示在表格中。为了简洁,程序没有对输入条件、增加、删除、修改等进行处理。 程序源代码(红色部分是手写的,具体功能见注释,其余是由JB9自动生成的): package untitled1; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; import javax.swing.table.DefaultTableModel; public class Frame1 extends JFrame { JPanel jPanel1 = new JPanel(); JPanel jPanel2 = new JPanel(); JScrollPane jScrollPane1 = new JScrollPane(); JTable jTable1 = new JTable(); JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); JButton jButton4 = new JButton(); public Frame1() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Frame1 frame1 = new Frame1(); //定义显示窗体的大小显示窗口 frame1.setSize(400, 350); frame1.show(); //激活“查询”按钮事件 frame1.jButton1.doClick(); } private void jbInit() throws Exception { this.getContentPane().setLayout(null); jPanel1.setBackground(Color.red); jPanel1.setBounds(new Rectangle(43, 15, 297, 48)); jPanel1.setLayout(null); jPanel2.setBounds(new Rectangle(50, 232, 297, 48)); jPanel2.setLayout(null); jPanel2.setBackground(Color.orange); jScrollPane1.getViewport().setBackground(Color.pink); jScrollPane1.setBounds(new Rectangle(53, 74, 287, 138)); jLabel1.setFont(new java.awt.Font("Dialog", 0, 15)); jLabel1.setText("输入查内容"); jLabel1.setBounds(new Rectangle(44, 12, 80, 27)); jTextField1.setText(""); jTextField1.setBounds(new Rectangle(125, 14, 70, 22)); jButton1.setBounds(new Rectangle(221, 12, 61, 24)); jButton1.setFont(new java.awt.Font("Dialog", 0, 13)); jButton1.setText("查询"); jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this)); jButton2.setBounds(new Rectangle(13, 14, 66, 27)); jButton2.setFont(new java.awt.Font("Dialog", 0, 13)); jButton2.setText("增加"); jButton3.setText("删除"); jButton3.setBounds(new Rectangle(115, 14, 66, 27)); jButton3.setFont(new java.awt.Font("Dialog", 0, 13)); jButton4.setText("修改"); jButton4.setBounds(new Rectangle(217, 14, 66, 27)); jButton4.setFont(new java.awt.Font("Dialog", 0, 13)); this.addHierarchyBoundsListener(new Frame1_this_hierarchyBoundsAdapter(this)); this.addComponentListener(new Frame1_this_componentAdapter(this)); this.getContentPane().add(jPanel1, null); jPanel1.add(jTextField1, null); jPanel1.add(jButton1, null); jPanel1.add(jLabel1, null); this.getContentPane().add(jPanel2, null); jPanel2.add(jButton3, null); jPanel2.add(jButton4, null); jPanel2.add(jButton2, null); this.getContentPane().add(jScrollPane1, null); jScrollPane1.getViewport().add(jTable1, null); } void this_componentResized(ComponentEvent e) { //设置jPanel1的起点坐标 jPanel1.setLocation(0,0); //设置jPanel1的高度和宽度 jPanel1.setSize(this.getWidth(),jPanel1.getHeight()); //设置jPanel2的起点坐标(37是标题栏的高度) jPanel2.setLocation(0,this.getHeight()-jPanel2.getHeight()-37); //设置jPanel2的高度和宽度 jPanel2.setSize(this.getWidth(),jPanel2.getHeight()); //设置jScrollPanel的起点坐标 jScrollPane1.setLocation(0,jPanel1.getHeight()); //设置jScrollPanel的高度和宽度 jScrollPane1.setSize(this.getWidth(),jPanel2.getY()-jPanel1.getHeight()); } void jButton1_actionPerformed(ActionEvent e) { // “查询”按钮事件,模拟从数据库中取数据并显示在表格中 try { Vector vcol = new Vector(); //列名 Vector vrow = new Vector(); //内容 //用一个for循环来模拟数据库的内容 for (int col=1;col<31;col++) { vcol.addElement("列"+col); } for (int row=1;row<101;row++) { Vector vr1 = new Vector(); for (int col=1;col<31;col++) { vr1.addElement(row+"/"+col); } vrow.addElement(vr1); } DefaultTableModel dtm=new DefaultTableModel(vrow,vcol); jTable1 = new JTable(vrow,vcol); //滚动条设置左右滚 jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); //在滚动条中放入表 this.jScrollPane1.getViewport().add(jTable1, null); } catch(Exception ex) { System.out.println("错误:" + ex); } } } class Frame1_this_hierarchyBoundsAdapter extends java.awt.event.HierarchyBoundsAdapter { Frame1 adaptee; Frame1_this_hierarchyBoundsAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void ancestorResized(HierarchyEvent e) { } } class Frame1_this_componentAdapter extends java.awt.event.ComponentAdapter { Frame1 adaptee; Frame1_this_componentAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void componentResized(ComponentEvent e) { adaptee.this_componentResized(e); } } class Frame1_jButton1_actionAdapter implements java.awt.event.ActionListener { Frame1 adaptee; Frame1_jButton1_actionAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); } } |
|