Java图形化界面编程一
Posted 猪八戒1.0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java图形化界面编程一相关的知识,希望对你有一定的参考价值。
目录
一:介绍
java使用AWT和Swing相关的类可以完成图形化界面编程,其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit),它是sun公司最早提供的GUI库,这个GUI库提供了一些基本功能,但这个GUI库的功能比较有限,所以后来sun公司又提供了Swing库。通过使用AWT和Swing提供的图形化界面组件库,java的图形化界面编程非常简单,程序只需要依次创建所需的图形组件,并以合适的方式将这些组件组织在一起,就可以开发出非常美观的用户界面。
二:AWT编程
2.1AWT介绍
当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具集 CAbstract Window Toolkit )",它为Java应用程序提供了基本的图形组件 。 AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件 , 当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台 。 简而言之 ,当使用 AWT 编写图形界面应用 时, 程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM调用操作系统本地的图形界面来创建和平台 一致的对等体 。
使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格 , 比如在 Windows 操作系统上,它就表现出 Windows 风格 ; 在 UNIX 操作系统上,它就表现出UNIX 风格 。 Sun 希望采用这种方式来实现 " Write Once, Run Anywhere " 的目标 。
2.2 AWT继承体系
所有和 AWT 编程相关的类都放在 java.awt 包以及它的子包中, AWT 编程中有两个基类 :Component和 MenuComponent。
-
Component:代表一个能以图形化方式显示出来,并可与用户交互的对象,例如 Button 代表一个按钮,TextField 代表 一个文本框等;
-
MenuComponent:则代表图形界面的菜单组件,包括 MenuBar (菜单条)、 Menultem (菜单项)等子类。
其中 Container 是一种特殊的 Component,它代表一种容器,可以盛装普通的 Component。AWT中还有一个非常重要的接口叫LayoutManager ,如果一个容器中有多个组件,那么容器就需要使用LayoutManager来管理这些组件的布局方式。
2.3 Container容器
2.3.1 Container继承体系
-
Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;
-
Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使FlowLayout管理其内部组件布局;
-
ScrollPane 是 一个带滚动条的容器,它也不能独立存在,默认使用 BorderLayout 管理其内部组件布局;
2.3.2 常见API
2.3.3 容器演示
2.3.3.1 Window
测试:
import java.awt.*;
public class WindowDemo
public static void main(String[] args)
//创建一个窗口
Frame frame=new Frame("测试Windows窗口");
//设置位置和大小
frame.setLocation(500,300);
frame.setSize(500,300);
//或者
//frame.setBounds(500,300,500,300);
//设置可见
frame.setVisible(true);
运行:
2.3.3.2 Panel
测试:
import java.awt.*;
public class PanelDemo
public static void main(String[] args)
//1.创建一个Windows对象 因为pannel及其他容器都不能独立存在,需要依附window存在
Frame frame=new Frame("测试Pannel");
//2.创建Pannel对象
Panel panel=new Panel();
//3.创建一个文本框和一个按钮并把他们放入Pannel容器中
panel.add(new TextField("这里是一个测试文本"));
panel.add(new Button("这里是一个测试按钮"));
//4.将pannel放入window中
frame.add(panel);
//5.设置window位置和大小
frame.setBounds(500,300,500,300);
//设置可见
frame.setVisible(true);
运行:
由于IDEA默认使用utf-8进行编码,但是当前我们执行代码是是在windows系统上,而windows操作系统的默认编码是gbk,所以会乱码,如果出现了乱码,那么只需要在运行当前代码前,设置一个jvm参数 -Dfile.encoding=gbk即可。(后面不再强调)
再次运行
2.3.3.3 ScrollPane
测试:
import java.awt.*;
public class ScrolPaneDemo
public static void main(String[] args)
Frame frame=new Frame("演示ScrollPane");
//1.创建一个ScrollPane对象 SCROLLBARS_ALWAYS总是有滚动条
ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
//2.创建一个文本框和一个按钮
scrollPane.add(new TextField("这是一个测试文本"));
scrollPane.add(new Button("这里是一个测试按钮"));
//将scrollPanne放入window中
frame.add(scrollPane);
frame.setBounds(500,300,500,300);
frame.setVisible(true);
运行:
程序明明向 ScrollPane 容器中添加了 一个文本框和一个按钮,但只能看到 一个按钮,却看不到文本框 ,这是为什么 呢?这是因为ScrollPane 使用 BorderLayout 布局管理器的缘故,而 BorderLayout 导致了该容器中只有一个组件被显示出来 。
2.4 LayoutManager布局管理器
之前,我们介绍了Component中有一个方法 setBounds() 可以设置当前容器的位置和大小,但是我们需要明确一件事,如果我们手动的为组件设置位置和大小的话,就会造成程序的不通用性。
如果要让我么的程序在不同的操作系统下,都有相同的使用体验,那么手动设置组件的位置和大小,无疑是一种灾难,因为有太多的组件,需要分别设置不同操作系统下的大小和位置。为了解决这个问题,Java提供了LayoutManager布局管理器,可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置了,只需要为容器选择合适的布局管理器即可。
2.4.1 FlowLayout
在 FlowLayout 布局管理器 中,组件像水流一样向某方向流动 (排列) ,遇到障碍(边界)就折回,重头开始排列 。在默认情况下, FlowLayout 布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。
测试:
import java.awt.*;
public class FlowLayoutDemo
public static void main(String[] args)
Frame frame=new Frame("演示Flowlayout");
//1.通过setLayout方法设置容器的布局管理器
frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,30));
//2.添加多个按钮到frame中
for (int i = 1; i <=50; i++)
frame.add(new Button("按钮"+i));
//3.设置最佳大小,用pack()方法
frame.pack();
frame.setVisible(true);
运行:
2.4.2 BorderLayout
BorderLayout 将容器分为 EAST、SOUTH、WEST 、NORTH 、CENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。
当改变使用 BorderLayout 的容器大小时, NORTH 、 SOUTH 和 CENTER区域水平调整,而 EAST 、 WEST 和 CENTER 区域垂直调整。使用BorderLayout 有如下两个注意点:
-
当向使用 BorderLayout 布局管理器的容器中添加组件时 , 需要指定要添加到哪个区域中 。 如果没有指定添加到哪个区域中,则默认添加到中间区域中;
-
如果向同一个区域中添加多个组件时 , 后放入的组件会覆盖先放入的组件;
-
如果不往某个区域中放入组件,那么该区域不会空白出来,而是会被其他区域占用
测试1:
import java.awt.*;
public class BorderLayoutDemo1
public static void main(String[] args)
Frame frame=new Frame("演示BorderLayout");
//1.通过setLayout方法设置容器的布局管理器
//其实不设置也可以,window默认使用BorderLayout管理其内部组件布局
frame.setLayout(new BorderLayout(30,10));
//2.往frame指定区域添加组件
frame.add(new Button("北侧按钮"),BorderLayout.NORTH);
frame.add(new Button("南侧按钮"),BorderLayout.SOUTH);
frame.add(new Button("西侧按钮"),BorderLayout.WEST);
frame.add(new Button("东侧按钮"),BorderLayout.EAST);
frame.add(new Button("中间按钮"),BorderLayout.CENTER);
//3.设置最佳大小,用pack()方法
frame.pack();
frame.setVisible(true);
运行:
测试2:
import java.awt.*;
public class BorderLayoutDemo2
public static void main(String[] args)
//1.创建Frame对象
Frame frame = new Frame("这里测试BorderLayout");
//2.指定Frame对象的布局管理器为BorderLayout
frame.setLayout(new BorderLayout(30,5));
//3.往Frame指定南,北,放入一个按钮,往中间区域放入一个Panel
frame.add(new Button("南侧按钮"), BorderLayout.SOUTH);
frame.add(new Button("北侧按钮"), BorderLayout.NORTH);
Panel panel = new Panel();
panel.add(new TextField("测试文本"));
panel.add(new Button("中间按钮"));
frame.add(panel, BorderLayout.CENTER);
//4.设置Frame为最佳大小
frame.pack();
//5.设置Frame可见
frame.setVisible(true);
运行:
2.4.3 GridLayout
GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLayout不同的是,放置在 GridLayout 布局管理器中的各组件的大小由组件所处的区域决定(每 个组件将自动占满整个区域) 。
测试
import java.awt.*;
public class GridLayoutDemo
public static void main(String[] args)
Frame frame=new Frame("计算器");
//1.创建一个Pannel对象,里面存放一个TextFiled组件
//30表示最多能容纳30个字符
Panel p1 = new Panel();
p1.add(new TextField(30));
//2.把当前这个Panel添加到frame的北边区域
frame.add(p1,BorderLayout.NORTH);
//3,创建一个Pannel对象,并设置它的布局管理器为GridLayout
//Pannel 默认的布局管理器是FlowLayout
//GridLayout(int rows,int cols,int hgap,int vgap)
Panel p2=new Panel();
p2.setLayout(new GridLayout(3,5,4,4));
//4.往Pannel中添加内容
for (int i = 0; i < 10; i++)
//Button(字符串) i+""即变为字符串类型
p2.add(new Button(i+""));
p2.add(new Button("+"));
p2.add(new Button("-"));
p2.add(new Button("*"));
p2.add(new Button("/"));
p2.add(new Button("."));
//5.将Pannel添加到frame中
frame.add(p2);
frame.pack();
frame.setVisible(true);
运行:
2.4.4 GridBagLayout
GridBagLayout 布局管理器的功能最强大 , 但也最复杂,与 GridLayout 布局管理器不同的是, 在GridBagLayout 布局管理器中,一个组件可以跨越一个或多个网格 , 并可以设置各网格的大小互不相同,从而增加了布局的灵活性 。 当窗口的大小发生变化时 , GridBagLayout 布局管理器也可以准确地控制窗口各部分的拉伸 。(不好用,Swing中的布局管理器更好用,下面不做测试)
由于在GridBagLayout 布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。 GridBagConstraints API不做演示
2.4.5 CardLayout
CardLayout 布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个 Component 才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见。
测试:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CardLayoutDemo
public static void main(String[] args)
Frame frame = new Frame("这里测试CardLayout");
//1.创建一个Pannel,用来存储多张卡片
Panel p1 = new Panel();
//2.创建CardLayout对象,并且把该对象设置给之前创建的容器
CardLayout cardLayout = new CardLayout();
p1.setLayout(cardLayout);
//3.往Pannel中存储多个组件
String[] names = "第一页", "第二页", "第三页", "第四页", "第五页";
for (int i = 0; i < 5; i++)
p1.add(names[i], new Button(names[i]));
//4.把Pannel放到frame的中间区域
//或者frame.add(p1,BorderLayout.CENTER);
frame.add(p1);
//5.创建另一个Pannel p2用来存储多个按钮组件
Panel p2 = new Panel();
//6.创建5个按钮组件
Button b1 = new Button("上一张");
Button b2 = new Button("下一张");
Button b3 = new Button("第一张");
Button b4 = new Button("最后一张");
Button b5 = new Button("第三张");
//7.创建一个事件监听器,监听按钮的点击动作
ActionListener listener = new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
//这个字符串其实就是按钮上的文字
String actionCommand = e.getActionCommand();
switch (actionCommand)
case "上一张":
cardLayout.previous(p1);
break;
case "下一张":
cardLayout.next(p1);
break;
case "第一张":
cardLayout.first(p1);
break;
case "最后一张":
cardLayout.last(p1);
break;
case "第三张":
cardLayout.show(p1, "第三张");
break;
;
//8.把当前这个事件监听器和多个按钮绑定在一起
b1.addActionListener(listener);
b2.addActionListener(listener);
b3.addActionListener(listener);
b4.addActionListener(listener);
b5.addActionListener(listener);
//9.把按钮添加到容器p2中
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(b4);
p2.add(b5);
//10.把p2放在frame的南边区域
frame.add(p2,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
运行:
2.4.6 BoxLayout
为了简化开发,Swing 引入了 一个新的布局管理器 : BoxLayout 。 BoxLayout 可以在垂直和 水平两个方向上摆放 GUI 组件, BoxLayout 提供了如下一个简单的构造器:
测试1:
package layout;
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo1
public static void main(String[] args)
Frame frame=new Frame("这里测试BoxLayout");
//1.基于frame创建一个BoyLayout对象 并且该对象存放组件是垂直存放
BoxLayout boxLayout = new BoxLayout(frame,BoxLayout.Y_AXIS);
//2.把BoyLayout对象设置给Frame
frame.setLayout(boxLayout);
//3.往frame中添加两个按钮组件
frame.add(new Button("按钮1"));
frame.add(new Button("按钮2"));
frame.pack();
frame.setVisible(true);
运行:
在java.swing包中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout,大多数情况下,使用Box容器去容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局。
方法名称 | 方法功能 |
---|---|
static Box createHorizontalBox() | 创建一个水平排列组件的 Box 容器 。 |
static Box createVerticalBox() | 创建一个垂直排列组件的 Box 容器 。 |
测试2:
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo2
public static void main(String[] args)
//1.创建Frame对象
Frame frame = new Frame("这里测试BoxLayout");
//2.创建一个横向的Box,并添加两个按钮
Box hBox = Box.createHorizontalBox();
hBox.add(new Button("水平按钮一"));
hBox.add(new Button("水平按钮二"));
//3.创建一个纵向的Box,并添加两个按钮
Box vBox = Box.createVerticalBox();
vBox.add(new Button("垂直按钮一"));
vBox.add(new Button("垂直按钮二"));
//4.把box容器添加到frame容器中
frame.add(hBox,BorderLayout.NORTH);
frame.add(vBox);
//5.设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
运行:
通过之前的两个BoxLayout演示,我们会发现,被它管理的容器中的组件之间是没有间隔的,不是特别的美观,但之前学习的几种布局,组件之间都会有一些间距,那使用BoxLayout如何给组件设置间距呢?
其实很简单,我们只需要在原有的组件需要间隔的地方,添加间隔即可,而每个间隔可以是一个组件,只不过该组件没有内容,仅仅起到一种分隔的作用。
Box类中,提供了5个方便的静态方法来生成这些间隔组件:
方法名称 | 方法功能 |
---|---|
static Component createHorizontalGlue() | 创建一条水平 Glue (可在两个方向上同时拉伸的间距) |
static Component createVerticalGlue() | 创建一条垂直 Glue (可在两个方向上同时拉伸的间距) |
static Component createHorizontalStrut(int width) | 创建一条指定宽度(宽度固定了,不能拉伸)的水平Strut (可在垂直方向上拉伸的间距) |
static Component createVerticalStrut(int height) | 创建一条指定高度(高度固定了,不能拉伸)的垂直Strut (可在水平方向上拉伸的间距) |
测试:
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo3
public static void main(String[] args)
Frame frame = new Frame("这里测试BoxLayout");
//1.创建水平排列的Box容器 hBox
Box hBox = Box.createHorizontalBox();
//2.往Box容器中添加按钮,还需要在多个按钮之间添加分割
hBox.add(new Button("水平按钮一"));
hBox.add(Box.createHorizontalGlue());//水平Glue该分割在两个方向都可以拉伸
hBox.add(new Button("水平按钮二"));
hBox.add(Box.createHorizontalStrut(30));
hBox.add(new Button("水平按钮三"));
//3.创建垂直排列的Box容器 vBox
Box vBox = Box.createVerticalBox();
//4.往vBox容器中添加按钮,还需要在多个按钮之间添加分割
vBox.add(new Button("垂直按钮一"));
vBox.add(Box.createVerticalGlue());//垂直Glue()该分割在两个方向上都可以拉伸
vBox.add(new Button("垂直按钮二"));
vBox.add(Box.createVerticalStrut(30));
vBox.add(new Button("垂直按钮三"));
//5.把box容器添加到frame中
frame.add(hBox,BorderLayout.NORTH);
frame.add(vBox);
frame.pack();
frame.setVisible(true);
运行:
2.5 AWT中常用组件
2.5.1 基本组件
组件名 | 功能 |
---|---|
Button | Button |
Canvas | 用于绘图的画布 |
Checkbox | 复选框组件(也可当做单选框组件使用) |
CheckboxGroup | 用于将多个Checkbox 组件组合成一组, 一组 Checkbox 组件将只有一个可以 被选中 , 即全部变成单选框组件 |
Choice | 下拉选择框 |
Frame | 窗口 , 在 GUI 程序里通过该类创建窗口 |
Label | 标签类,用于放置提示性文本 |
List | JU表框组件,可以添加多项条目 |
Panel | 不能单独存在基本容器类,必须放到其他容器中 |
Scrollbar | 滑动条组件。如果需要用户输入位于某个范围的值 , 就可以使用滑动条组件 ,比如调 色板中设置 RGB 的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、 滑块的大小、最小值和最大值。 |
ScrollPane | 带水平及垂直滚动条的容器组件 |
TextArea | 多行文本域 |
TextField | 单行文本框 |
这些 AWT 组件的用法比较简单,可以查阅 API 文档来获取它们各自的构方法、成员方法等详细信息。
测试:
import javax.swing.*;
import java.awt.*;
public class BasicComponentDemo
Frame frame = new Frame("这里测试基本组件");
//定义一个5行,20列的多行文本域
TextArea ta = new TextArea(5, 20);
//定义一个下拉选择框
Choice colorChooser = new Choice();
//定义一个复选框组
CheckboxGroup cbg = new CheckboxGroup();
//定义一个单选框,初始处于被选中状态,并添加到cbg组中
Checkbox male = new Checkbox("男", cbg, true);
//定义一个单选框,初始处于未被选中状态,并添加到cbg组中
Checkbox female = new Checkbox("女", cbg, false);
//定义一个复选框,初始处于未被选中状态
Checkbox married = new Checkbox("是否已婚?", false);
//定义一个50列的单行文本域
TextField tf = new TextField(50);
//定义一个按钮
Button ok = new Button("确认");
//定义一个列表选择框 true代表可以多选
List colorList = new List(6,true);
public void init()
//创建一个垂直排列的Box容器,装载 多行文本域和checkPanel
Box topLeft = Box.createVerticalBox();
topLeft.add(ta);
//往列表选择框中添加内容
colorList.add("红色");
colorList.add("绿色");
colorList.add("蓝色");
//创建一个水平排列的Box容器,装载topLeft和列表选择框
Box top = Box.createHorizontalBox();
top.add(topLeft);
top.add(colorList);
//将top添加到frame的中间区域
frame.add(top);
//往下拉选择框中添加内容
colorChooser.add("红色");
colorChooser.add("绿色");
colorChooser.add("蓝色");
//创建一个装载按钮和文本框的Panel容器
//创建一个Panel容器,装载下拉选择框,单选框和复选框
Panel checkPanel = new Panel();
checkPanel.add(colorChooser);
checkPanel.add(male);
checkPanel.add(female);
checkPanel.add(married);
topLeft.add(checkPanel);
Panel bottom = new Panel();
bottom.add(tf);
bottom.add(ok);
//把bottom添加到Frame的底部
frame.add(bottom,BorderLayout.SOUTH);
//设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
new BasicComponentDemo().init();
运行:
2.5.2 对话框Dialog
2.5.2.1 Dialog
Dialog 是 Window 类的子类,是 一个容器类,属于特殊组件 。 对话框是可以独立存在的顶级窗口, 因此用法与普通窗口的用法几乎完全一样,但是使用对话框需要注意下面两点:
-
对话框通常依赖于其他窗口,就是通常需要有一个父窗口;
-
对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开后,该模式对话框总是位于它的父窗口之上,在模式对话框被关闭之前,父窗口无法获得焦点。
方法名称 | 方法功能 |
---|---|
Dialog(Frame owner, String title, boolean modal) | 创建一个对话框对象: owner:当前对话框的父窗口 title:当前对话框的标题 modal:当前对话框是否是模式对话框,true/false |
测试:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo1
public static void main(String[] args)
Frame frame = new Frame("这里测试Dialog");
Dialog d1 = new Dialog(frame, "模式对话框", true);
Dialog d2 = new Dialog(frame, "非模式对话框", false);
Button b1 = new Button("打开模式对话框");
Button b2 = new Button("打开非模式对话框");
//设置对话框的大小和位置
d1.setBounds(20,30,300,400);
d2.setBounds(20,30,300,400);
//给b1和b2绑定监听事件
b1.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
d1.setVisible(true);
);
b2.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
d2.setVisible(true);
);
//把按钮添加到frame中
frame.add(b1);
frame.add(b2,BorderLayout.SOUTH);
//设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
运行:
测试2:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class DialogDemo2
public static void main(String[] args)
Frame frame = new Frame("这里测试Dialog");
Button b1 = new Button("打开模式对话框");
Dialog d1 = new Dialog(frame, "模式对话框", true);
//往对话框中添加内容
Box vBox = Box.createVerticalBox();
vBox.add(new TextField(15));
vBox.add(new JButton("确认"));
d1.add(vBox);
//设置对话框的大小和位置
d1.setBounds(20,30,300,100);
//给b1绑定监听事件
b1.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
d1.setVisible(true);
);
//把按钮添加到frame中
frame.add(b1);
//设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
运行:
2.5.2.1 FileDialog
Dialog 类还有 一个子类 : FileDialog ,它代表一个文件对话框,用于打开或者保存 文件,需要注意的是FileDialog无法指定模态或者非模态,这是因为 FileDialog 依赖于运行平台的实现,如果运行平台的文件对话框是模态的,那么 FileDialog 也是模态的;否则就是非模态的 。
方法名称 | 方法功能 |
---|---|
FileDialog(Frame parent, String title, int mode) | 创建一个文件对话框: parent:指定父窗口 title:对话框标题 mode:文件对话框类型,如果指定为FileDialog.load,用于打开文件,如果指定为FileDialog.SAVE,用于保存文件 |
String getDirectory() | 获取被打开或保存文件的绝对路径 |
String getFile() | 获取被打开或保存文件的文件名 |
测试:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FileDialogTest
public static void main(String[] args)
Frame frame = new Frame("这里测试FileDialog");
Button b1 = new Button("打开文件");
Button b2 = new Button("保存文件");
FileDialog d1 = new FileDialog(frame, "选择需要加载的文件", FileDialog.LOAD);
FileDialog d2 = new FileDialog(frame, "选择需要保存的文件", FileDialog.SAVE);
//给按钮添加事件
b1.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
d1.setVisible(true);
//打印用户选择的文件路径和名称
System.out.println("用户选择的文件路径:"+d1.getDirectory());
System.out.println("用户选择的文件名称:"+d1.getFile());
);
System.out.println("-------------------------------");
b2.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
d2.setVisible(true);
//打印用户选择的文件路径和名称
System.out.println("用户选择的文件路径:"+d2.getDirectory());
System.out.println("用户选择的文件名称:"+d2.getFile());
);
//添加按钮到frame中
frame.add(b1);
frame.add(b2,BorderLayout.SOUTH);
//设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
运行:
以上是关于Java图形化界面编程一的主要内容,如果未能解决你的问题,请参考以下文章