java使用awt和swing可以完成图形化界面编程
其中AWT的全称是抽象窗具集(Abstract Window Toolkit)它是sun公司最早提供的GUI库,这个GUI库提供了一些基本功能,但这个GUI库的功能比较有限,所以后来sun公司又提供了Swing。通过使用AWT和Swng提供的图形化界面组件片,java的图形化界面编程非常简单。
Swing Hello World
// server.java import javax.swing.*; public class server { public static void main(String[] args) { JFrame jFrame = new JFrame("title"); JButton button = new JButton("Test button"); jFrame.add(button);//把button添加到JFrame中 jFrame.setSize(300,300);//设置JFrame大小 jFrame.setVisible(true);//设置可见,不然的话看不到 } }
第一次修改
有没有觉得有点奇怪,整个button占满了窗口?
没错,少了一个JPanel:
import javax.swing.*; public class server { public static void main(String[] args) { JFrame jFrame = new JFrame("title"); JPanel jPanel = new JPanel(); JButton button = new JButton("Test button"); jPanel.add(button); jFrame.setContentPane(jPanel); jFrame.setSize(300,300); jFrame.setVisible(true); } }
添加一个JPanel,把Button添加到JPanel中,然后设置JFrame的contenPane.
效果如下:
第二次修改
嗯,有点hello world的样子了,但是你有没有点击过左上角的x按钮?
点了之后,这个东西是”消失”了,但是在后台还在运行着,所以…
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
需要这样设置它的默认关闭操作.
另一个修改就是对它居中显示,要不然的话总是启动的时候在左上角.
很简单,一行就可以了.
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
完整代码:
import javax.swing.*; public class server { public static void main(String[] args) { JFrame jFrame = new JFrame("title"); JPanel jPanel = new JPanel(); JButton button = new JButton("Test button"); jPanel.add(button); jFrame.setContentPane(jPanel); jFrame.setSize(300,300); jFrame.setLocationRelativeTo(null); jFrame.setVisible(true); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
awt详解以及简单应用
GUI
图形用户界面
CLI
命令行用户接口
Java为GUI提供的对象存在java.Awt和Javax.Swing两个包中.
Java当中如何完成图形化界面的制作呢?
AWT:abstract Window ToolKit.需要调用本地系统实现功能.属于重量级控件.依赖于平台.跨平台性不是特别好.
Javax.Swing:在AWT基础上.建立一套图形化系统,提供更多组件,完全由java实现,增强了可移植性,属于轻量级控件.所以以后最好用Swing开发.
还有一个SWT外观包.
Lable用来封装文字.CheckBox复选框.TextComponent:文本组件.
Container: 容器,是一个特殊的组件,可以通过add方法来添加其他组件进来.
Window:Frame框架.Dialog:对话框.FileDialog:文件对话框就是打负责文件的选取和保存的窗口.
容器中的组件的排放方式,就是布局.
Panel:面板
常见的布局管理器:
FlowLayout:流式布局管理器.先放中间.第二次放右边.默认居中.
从左到右.
Panel默认的布局管理器
BorderLayout:边界式布局
上下左右打麻将.如果不指定方向,那么会居中直接填满整个窗口.添加新组件就覆盖原组件.
GridLayout:网格式布局
每个组件都存放在格子当中,计算器就是一个GridLayout.
GridBagLayout:网格包布局管理器.
CardLayout:卡片式布局:
创建图形化界面:
1. 创建Frame窗体 2. 对窗体进行基本设置,比如大小位置和布局 3. 定义组件 4. 将组件通过窗体的add()添加到窗体中 5. 让窗体显示,通过setVisible(true);方法
事件监听机制:
1. 事件源:图形界面组件. 2. 事件:Event.每一个事件源都有自己的特有的对应事件和共性事件. 3. 监听器:可以触发某一个事件的动作都已经封装到了监听器中,
以上三者在Java中都定义好了,直接获取其对象就可以了.我们要做的事情就是对产生的动作进行处理.
添加监听器:f.add(WindowListener wl)
WindowListener的一个抽象子类 WindowAdapter,已经实现了接口,覆盖了其中所有方法,只要继承WindowAdapter覆盖自己需要的方法即可!
一般开发awt要导入两个包: java.awt.*;java.awt.event.*;
要让按钮具备退出的功能,那么按钮就是事件源,添加一个监听器.ActionListener是少数没有Adapter类的其中一个.因为它里面只有一个方法,直接实现即可.ActionPerfored(ActionEvent ae);
鼠标事件和键盘事件:
AddKeyListener
AddMouseListener
此时点击按钮谁会先执行?
鼠标动作先.
下面我们来动手做一些图形化界面:
实例1
package guiDemos; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AwtDemo1 { public static void main(String[] args) { Frame f = new Frame("my awt"); f.setLayout(new FlowLayout()); f.setVisible(true); f.setSize(300,200); f.setLocation(700, 400); Button b = new Button("我是一个按钮");//定义一个按钮,名称为"我是一个按钮" f.add(b); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.out.println("我关!"); System.exit(0); //点击右上角关闭按钮,退出虚拟机 } public void windowActivated(WindowEvent e1){ System.out.println("activated"); //每次窗口被激活,打印"activated" } public void windowOpened(WindowEvent e2){ System.out.println("我活啦!"); //每次打开窗口,会输出"我活啦" } }); System.out.println("hello world!"); } } class myWindow extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.out.println("window closing"); e.getWindow(); System.out.println(e.toString()); System.out.println(e.getWindow()); System.out.println(e.getSource()); System.exit(0); } }
实例2
package guiDemos; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class FrameDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 new Frame_Demo(); } } class Frame_Demo { private Frame f; private Button but; Frame_Demo() { init(); } public void init() { f = new Frame("myFrame"); f.setBounds(1000, 500, 300, 400); f.setLayout(new FlowLayout()); but = new Button("Run"); myEvent(); f.add(but); f.setVisible(true); but.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 System.out.println("button do"); System.exit(0); } }); } private void myEvent() { f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) { System.out.println("活了"); } }); } }
实例3
package guiDemos; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.TextField; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MouseKeyEventDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 new mouseAndKey(); } } class mouseAndKey { private Frame f; private Button but; private TextField tf; mouseAndKey() { init(); } public void init() { f = new Frame("myFrame"); f.setBounds(1000, 500, 300, 400); f.setLayout(new FlowLayout()); but = new Button("Run"); tf = new TextField(20); myEvent(); f.add(tf); f.add(but); f.setVisible(true); tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); //判断输入的键值是否为数字 if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) { System.out.println(code+"is illegal"); e.consume(); } } }); /* * but.addActionListener(new ActionListener() { * * @Override public void actionPerformed(ActionEvent e) { // TODO * 自动生成的方法存根 System.out.println("button do"); System.exit(0); } }); */ but.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) { System.out.println("entered"); } public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) System.out.println("双击动作"); } }); but.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (KeyEvent.getKeyText(e.getKeyCode()).equals("Q") && e.isControlDown()) System.exit(0); System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar()); System.out.println("CTRL+Q"); } }); } private void myEvent() { f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) { System.out.println("活了"); } }); } }
实例4
package guiDemos; import java.awt.FileDialog; import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class MyMenuDemo { private Frame frame; private MenuBar bar; private Menu fileMenu, subMenu; private MenuItem closeItem, openItem, saveItem; private FileDialog openDlg, saveDlg; private TextArea ta; MyMenuDemo() { init(); } public void init() { frame = new Frame("my Window"); bar = new MenuBar(); fileMenu = new Menu("文件"); openItem = new MenuItem("打开"); saveItem = new MenuItem("保存"); closeItem = new MenuItem("退出"); ta = new TextArea(); openDlg = new FileDialog(frame, "打开文件", FileDialog.LOAD); saveDlg = new FileDialog(frame, "保存文件", FileDialog.SAVE); frame.add(ta); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(closeItem); bar.add(fileMenu); frame.setMenuBar(bar); frame.setBounds(700, 300, 600, 500); frame.setVisible(true); closeItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 System.exit(0); } }); openItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 openDlg.setVisible(true); String fileName = openDlg.getDirectory() + openDlg.getFile(); if (openDlg.getFile() != null) { File f = new File(fileName); // File fileName = new File(openDlg.getFile()); // ta.append(f.toString()); ta.setText(""); BufferedReader br = null; try { br = new BufferedReader(new FileReader(f)); String line = null; while ((line = br.readLine()) != null) { ta.append(line + "\r\n"); } } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } } } } }); saveItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 saveDlg.setVisible(true); BufferedWriter bw = null; String fileName = saveDlg.getDirectory()+saveDlg.getFile(); if(saveDlg.getFile()!=null) { try { bw = new BufferedWriter(new FileWriter(fileName)); String text = ta.getText(); bw.write(text); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); }finally{ try { if(bw!=null) bw.close(); } catch (Exception e2) { // TODO: handle exception } } } } }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { // TODO 自动生成的方法存根 new MyMenuDemo(); } }
选择文件后,文本区中显示文本内内容,相当于一个windows小工具记事本
实例5
写一个程序,用于遍历并文件夹中的所有内容
package guiDemos; import java.awt.Button; import java.awt.Dialog; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; public class MyWindowDemo { private Frame frame; private TextField tf; private Button but; private TextArea ta; private Dialog dlg; private Label lbl; private Button butOK; MyWindowDemo() { init(); } public void init() { frame = new Frame("my Window"); frame.setBounds(900, 400, 400, 500); frame.setLayout(new FlowLayout()); tf = new TextField(30); but = new Button("转到"); ta = new TextArea(20, 40); frame.add(tf); frame.add(but); frame.add(ta); ta.setEditable(false); frame.setVisible(true); myEvent(); tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e){ if(KeyEvent.getKeyText(e.getKeyCode())=="Enter") doFile(); } }); but.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { doFile(); } }); } private void doFile(){ ta.setText(""); File f = new File(tf.getText()); if (!f.exists()) { // ta.setText("请重新输入地址"); dlg = new Dialog(frame, "输入错误",false); lbl = new Label("\""+f.toString()+"\""+"不是一个有效路径"); butOK = new Button("确定"); dlg.setLayout(new FlowLayout()); dlg.setBounds(900, 500, 300, 160); dlg.add(lbl); dlg.add(butOK); dlg.setVisible(true); dlg.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ dlg.setVisible(false); } }); butOK.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 dlg.setVisible(false); } }); } else fileList(f); } private void fileList(File f) { // TODO 自动生成的方法存根 File[] files = f.listFiles(); for (File file : files) { ta.append(file.toString()); ta.append("\r\n"); } /* * for (File file : files) { if (!file.isHidden()) { if * (file.isDirectory()) { ta.append(file.toString()); ta.append("\r\n"); * fileList(file); } else { ta.append(file.toString()); * ta.append("\r\n"); // System.out.println(f); } } } */ } private void myEvent() { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { // TODO 自动生成的方法存根 new MyWindowDemo(); } }
以上就是Java awt界面的api基本使用.
AWT和Swing概述
一、前言
这是一个很少用的技术了,所以只是粗略的了解一下
java使用awt和swing可以完成图形化界面编程
其中AWT的全称是抽象窗具集(Abstract Window Toolkit)它是sun公司最早提供的GUI库,这个GUI库提供了一些基本功能,但这个GUI库的功能比较有限,所以后来sun公司又提供了Swing。通过使用AWT和Swng提供的图形化界面组件片,java的图形化界面编程非常简单。
awt继承体系
其中Container是一种特殊的Component,它代表一种容器,可以盛装普通的Component。
AWT中还有个非常重要的接口叫LayoutManager如果个容器中有多个组件,那么容器就需要使用 LayoutManager来管理这些组件的布局方式。
container容器
Containe继承体系
Window是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;
Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局;
ScrollPane是一个带滚动条的容器,它也不能独立存在,默认使用BorderLayout管理其内部组件布局
常见的API
Component作为基类,提供了如下常用的方法付来设置组件的大小、位置、可见性等。
container作为容器根类,提供了如下方法来访问容器中的组件
容器的演示
ctrl+b查看了Frame的源码可知,Frame继承了window,所以可以直接创建对象
public class Frame extends Window implements MenuContainer
运行结果
panel测试
public class PanelDemo { public static void main(String[] args) { //1、创建一个window对象,因为panel以及其他的容器都不能独立存在,必须依附于window上 Frame frame=new Frame("这是演示Panel"); //2、创建一个Panel对象 Panel p =new Panel(); //3、创建一个文本框和一个按钮,并把它们放到Panel容器中 p.add(new TextField("这里是一个测试文本")); p.add(new Button("这是一个测试按钮")); //4、把panel放到window中 frame.add(p); //5、设置window的位置以及大小 frame.setBounds(100, 100, 500, 300); //6、设置window可见 frame.setVisible(true); } }
我们发现按钮乱码了,这是因为idea中设置的是utf-8,而我们这个按钮是以我们当前的操作系统(我的是window)来创建的,是中文的默认是gbk
我们只需要在配置环境这:
在虚拟机选项那加上下面这句即可,改成编码解码一致都是gbk就不会乱码了
-Dfile.encoding=gbk
运行:
件名 | 功能 |
Button | 按钮 |
Canvas | 用于绘图的画布 |
Checkbox | 复选框组件(也可当做单选框组件使用) |
CheckboxGroup |
用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中, 即全部变成单选框组件 |
Choice | 下拉选择框 |
Frame | 窗口,在GUI程序里通过该类创建窗口 |
Label | 标签类,用于放置提示性文本 |
List | 列表框件,可以添加多项条日 |
Panel | 不能单独存在基本容器类,必须放到其他容器中 |
滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中 设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向,初始值、滑块的大小、 最小值和最大值。 | |
Scrollbar | |
ScrollPane | 带水平及垂直滚动条的容器组件 |
TexlArea | 多行文本域 |
TextField | 单行文本框 |
Swing概述
Swing是由100%纯Java实现的,不再依赖于本地平台的GUI,因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing组件被称为轻量级组件而依赖于本地平台的AWT组件被称为重量级组件。
由于Swing的所有组件完全采用Java实现,不再调用本地平台的GUI,所以导致Swing图形界面的显示速度要比AWT图形界面的显示速度慢一些
,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。
Swing的优势:
Swing组件不再依赖于本地平台的GUI,无须采用各种平台的GUI交集,因此Swing提供了大量图形界面组件远远超出了AWT所提供的图形界面组件集。
Swing组件不再依赖于本地平台GUI,因此不会产生与平台相关的bug。
Swing组件在各种平台上运行时可以保证具有相同的图形界面外观Swing提供的这些优势,让Java修形界面程序真止实现了”WriteOnce,RunAnywhere的目标。
大部分Swing组件都是JComponent抽象类的直接或间接子类(并不是全部的Swing组件),Component类定义了所有子类组件的通用方法,Component类是AWT里javaawtContainer类的子类,这也是AWT和 Swing的联系之一。绝大部分Swing组件类继承了Container类,所以Swing组件都可作为容器使用(JFrame继承了Frame类)。
Swing组件和AWT组件的对应关系:
大部分情况下,只需要在AWT组件的名称前面加个J,就可以得到其对应的Swing组件名称,但有几个例外:
1.ComboBox对应于AWT里的Choice组件,但比Chcice组件功能更富
2.JFileChwoser:对应干AWT甲的FileDialog组件。
3.ScrollBar:对应丁AWT里的Scrollbar组件注意两个组件类名中b字母的大小写差别。
4.CheckBox对应于AWT里的Checkbox组件,注意两个组件类名中b字母的大小写差别,
5.CheckBoxMenultem:对应于AWT里的CheckboxMenultem组件,注意两个组件类名中b字母的大小写差别。