《Java程序设计》第16周周四:GUI编程及文件对话框的使用

来源:互联网 发布:网络公开课那个好 编辑:程序博客网 时间:2024/05/22 12:04
第一部分:实验项目 
项目一:文件及选择
目的:了解文件对话框的使用方法,熟悉GUI中事件驱动的核心步骤。
1. 阅读博文 “JFileChooser (Java Swing提供的文件选择对话框)”,了解博文大意。
2. 在IDE中输入(非复制、粘贴)博文中的代码,调试并运行。
3. 在上述界面中,增加如下控件:
    JLabel,显示文本为“所选文件or文件夹:”;
    JTextField,当选择了文件or文件夹后,显示所选择的文件or文件夹。
4. 完成上述功能。

项目一参考代码:
package com.liang;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;public class FileChooser extends JFrame implements ActionListener{    JButton open=null;    JTextField jtfPath = null;        public static void main(String[] args) {        new FileChooser();    }    public FileChooser(){        this.setLayout(new FlowLayout());                // 按钮初始化        open=new JButton("open");        // 添加监听        open.addActionListener(this);        // 把按钮添加到JFrame容器中        this.add(open);                // 添加文本框控件        jtfPath = new JTextField("选择的文件",40);        jtfPath.setEditable(false);     // 不可编辑        jtfPath.setHorizontalAlignment(JTextField.CENTER);    // 居中        this.add(jtfPath);                // 设置JFrame的大小,可显示,默认关闭按钮        this.setBounds(400, 200, 700, 500);        this.setVisible(true);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            }    @Override    public void actionPerformed(ActionEvent e) {        // TODO Auto-generated method stub        JFileChooser jfc=new JFileChooser();        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );        jfc.showDialog(new JLabel(), "选择");        File file=jfc.getSelectedFile();                if(file.isDirectory()){            System.out.println("文件夹:"+file.getAbsolutePath());                    }else if(file.isFile()){            System.out.println("文件:"+file.getAbsolutePath());        }        System.out.println(jfc.getSelectedFile().getName());                // 把文件路径显示在文本框中        jtfPath.setText(file.getAbsolutePath());    }}





注意:
1. 掌握GUI中常用的布局方式,对上述程序,设置布局为FlowLayout,或BorderLayout(参考教材P138-144)。
2.了解在线查看Java某个控件、类的使用方式,比较中英文文档的差异。其中site:XXX 表示在指定的网址搜索。
    中文:百度中搜索“site:apihome.cn java api XXX ”,如“site:apihome.cn java api JTextField
    英文:百度中搜索“site:docs.oracle.com java api XXX ”,如“site:docs.oracle.com java api JTextField
3. 总结Java 事件驱动的工作原理,参考并改写教材的例6-1(P115-116),把applet改写为JFrame。
4. 为什么需要“敲”代码?见博文  
to所有BBS的同学:怎样才是学习的好方法?转《笨方法学Python》,笨方法更简单。

项目二:图片显示
目的:了解GUI的图像显示的常用方式。
目标:利用项目一,获得需要显示的图像文件,显示在界面上(参考:java的swing中用谁什麽控件来装一张图片?,《Java程序设计》第14周实验作业:GUI编程初步)

项目二参考代码:
<pre name="code" class="java">import java.awt.Color;  import java.awt.FlowLayout;  import java.awt.event.ActionEvent;  import java.awt.event.ActionListener;  import java.io.File;  import java.io.FileFilter;  import javax.swing.ImageIcon;  import javax.swing.JButton;  import javax.swing.JFileChooser;  import javax.swing.JFrame;  import javax.swing.JLabel;  import javax.swing.JTextField;  class myFileFilter implements FileFilter{               @Override        public boolean accept(File pathname) {            String filename = pathname.getName().toLowerCase();            if(filename.contains(".jpg")){                return false;            }else{                return true;            }        }    }    public class FileChooser extends JFrame implements ActionListener{      /**      *       */      private static final long serialVersionUID = 1L;            JButton open=null;      JTextField jtfPath = null;      JLabel jlbImg = null;      JButton btnNext = null;            String strPath = "";    //文件夹路径      String strFileName = "";    //文件名称            File[] fileArray;   // 文件夹下所有文件      int NUM_IMG = 0;    // 文件总数目      int index   = 0;    // 当前文件的序号            public static void main(String[] args) {          new FileChooser();      }      public FileChooser(){          this.setTitle("Week17");          // 设置布局方式          this.setLayout(new FlowLayout());                    // 按钮初始化          open=new JButton("选择目录");          // 添加监听          open.addActionListener(this);          // 把按钮添加到JFrame容器中          this.add(open);                    // 添加文本框控件          jtfPath = new JTextField("选择的文件",40);          jtfPath.setEditable(false);     // 不可编辑          jtfPath.setHorizontalAlignment(JTextField.CENTER);    // 居中          this.add(jtfPath);                    // 显示下一张图片          btnNext = new JButton("显示下一张");          this.add(btnNext);          btnNext.addActionListener(this);                        // 添加显示Image的JLabel控件          jlbImg = new JLabel();          jlbImg.setBackground(Color.RED);          jlbImg.setBounds(100, 100, 200, 200);          this.add(jlbImg);                    // 设置JFrame的大小,可显示,默认关闭按钮          this.setBounds(400, 200, 700, 500);          this.setVisible(true);          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                }      @Override      public void actionPerformed(ActionEvent e) {          // TODO Auto-generated method stub                    //多个组件需要监听的情况下,事件响应的编码方式                if(e.getSource()==open){    //如果是open按钮              JFileChooser jfc=new JFileChooser();              //jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );              jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);              jfc.showDialog(new JLabel(), "选择");              File file=jfc.getSelectedFile();                            if(file.isDirectory()){                  System.out.println("文件夹:"+file.getAbsolutePath());                                }else if(file.isFile()){                  System.out.println("文件:"+file.getAbsolutePath());              }              System.out.println(jfc.getSelectedFile().getName());              // 把文件路径显示在文本框中              jtfPath.setText(file.getAbsolutePath());              //jlbImg.setIcon(new ImageIcon(file.getAbsolutePath()));                            // 获取文件路径 与文件名              strPath = file.getAbsolutePath();              strFileName = jfc.getSelectedFile().getName();                            if(file!=null && file.isDirectory()){                  // 参考: java中File.listFiles(FileFilter) FileFilter的使用                   //  http://zhouzaibao.iteye.com/blog/347557 ;                                    // 获取文件夹下所有的文件                  fileArray = file.listFiles();                  NUM_IMG = fileArray.length;              }                        }                    if(e.getSource()==btnNext){ //如果是next按钮              String strTmp = fileArray[index].toString();              index++;              if(index==NUM_IMG)                  index = 0;              jlbImg.setIcon(new ImageIcon(strTmp));          }             }  } 

附上运行的图片:
项目三:实验六 图形用户界面(教材P279-280)目标:完成实验六的内容。 
本地图片,请重新上传
注意:
1. 了解字符串转化为数字;数字转化为字符串的方式。
第二部分:作业博客要求
1. 在作业博客中,完成上述3个项目中至少2个,并把运行结果、代码写到博客中。2. 在作业博客中,回答以下三个问题:(1)简述Java中,GUI的事件驱动模式。
图形用户界面,是为应用程序提供一个图形化的界面,在此界面上借助与菜单、按钮、标签标识等组件和鼠标,用户和计算机之间可以方便地进行交互。(2)简述Java中,字符串转化为数值、数值转化为字符串的常用方式。
字符串型转换成各种数字类型:  
  String s = "169";   
byte b = Byte.parseByte( s );  
short t = Short.parseShort( s ); 
 int i = Integer.parseInt( s );  
long l = Long.parseLong( s );  
Float f = Float.parseFloat( s );  
Double d = Double.parseDouble( s ); (3) 简述Java中,JFileChooser使用的核心代码。
 import java.io.File;
  import javax.swing.JFileChooser; 
 import javax.swing.filechooser.FileFilter; 
public class FileChooserTest {  public static void main(String [] args) {
项目三的参考代码:
import java.awt.*;import java.awt.event.*; public class Computer extends Frame{    public static void main(String args[]) {        new Computer();    }         TextField number1 = new TextField();    TextField number2 = new TextField();    TextField result = new TextField();    Button plus = new Button("+");    Button subtract = new Button("-");    Button multiply = new Button("*");    Button divide = new Button("/");    double num1,num2,resl;         Computer(){        setLayout(null);         // 关闭窗口        this.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });        setBounds(200, 100, 400, 300);        setTitle("简单计算器");         // 设置窗口是否可变大小        setResizable(false);        setVisible(true);        number1.setBounds(100, 80, 150, 20);        add(number1);        number2.setBounds(100, 130, 150, 20);        add(number2);        result.setBounds(100, 180, 150, 20);        add(result);                 plus.setBounds(300, 55, 80, 20);        add(plus);        plus.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                if (number1.getText().trim() != "" && number2.getText().trim() != "") {                    num1 = Double.parseDouble(number1.getText().trim());                    num2 = Double.parseDouble(number2.getText().trim());                    resl = num1 + num2;                    result.setText(String.valueOf(resl));                    number1.setText("");                    number2.setText("");                }            }        });        subtract.setBounds(300, 105, 80, 20);        add(subtract);        subtract.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                if (number1.getText().trim() != "" && number2.getText().trim() != "") {                    num1 = Double.parseDouble(number1.getText().trim());                    num2 = Double.parseDouble(number2.getText().trim());                    resl = num1 - num2;                    result.setText(String.valueOf(resl));                    number1.setText("");                    number2.setText("");                }            }        });        multiply.setBounds(300, 155, 80, 20);        add(multiply);        multiply.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                if (number1.getText().trim() != "" && number2.getText().trim() != "") {                    num1 = Double.parseDouble(number1.getText().trim());                    num2 = Double.parseDouble(number2.getText().trim());                    resl = num1 * num2;                    result.setText(String.valueOf(resl));                    number1.setText("");                    number2.setText("");                }            }        });        divide.setBounds(300, 205, 80, 20);        add(divide);        divide.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                if (number1.getText().trim() != "" && number2.getText().trim() != "") {                    num1 = Double.parseDouble(number1.getText().trim());                    num2 = Double.parseDouble(number2.getText().trim());                    resl = num1 / num2;                    result.setText(String.valueOf(resl));                    number1.setText("");                    number2.setText("");                }            }        });    }         public void paint(Graphics g) {        g.setColor(Color.LIGHT_GRAY);        g.fillRect(20, 45, 250, 230);        g.setColor(Color.BLACK);        g.drawString("操作数1", 60, 95);        g.drawString("操作数2", 60, 145);        g.drawString("结果", 70, 195);    }}

运行结果的截图:



总结:虽然代码是给出的,但是在实验的第一、二···次的时候,我并没有将代码在自己的计算机中调试通,是因为当时没有理解代码中,点击按钮,按钮时怎样实现目录的选择以及图片的现实,也没有理解所谓的目录与路径的区别,所以此代码在运行的过程中一直存在错误。
另外,虽然项目三的实验,在去年已经做过,但是由于很久没有温习以前的知识以及本身对GUI理解很模糊,所以在实现的过程中并不是很顺畅。虽然,对于实现那个计算器的思路历历在目,但是就是不会用代码去实现,我的这种情况是典型的纸上谈兵。最后,在百度的过程中,解决了实现简单计算器的问题。从项目三,我感觉相比以前,自己只是对于布局这一块有了更加清晰了概念,看到一个界面的时候,可以知道它是用了哪一种布局;对于组件、面板、文本框、按钮以及标签的概念也有了更进一步的认识,但还是不能够很熟练地使用它们,不会将它们组合在一起。
附上项目二的运行结果图:

0 0