继前面的,这篇主要记录菜单和文件对话框的两个小练习,来熟悉一下方法的应用,一些简单的逻辑和Swing的相关简介,以及关于GUI基础的记录。

一、创建一个菜单

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JOptionPane; public class Test29 {
public static void main(String[] args) {
new MenuDeom();
}
} class MenuDeom {
MenuDeom() {
init();
} private Frame f;
private MenuBar mBar;
private Menu menu; private Menu subMenu; // 这是要当作二级菜单的,放在 menu 下 private MenuItem mItem1;
private MenuItem mItem2; private void init() {
f = new Frame("窗口标题");
f.setBounds(20, 20, 400, 500);
f.setLayout(new FlowLayout()); mBar = new MenuBar(); // 创建一个菜单栏
menu = new Menu("文件"); // 创建一个菜单 mItem1 = new MenuItem("打开");
mItem2 = new MenuItem("退出"); menu.add(mItem1);
menu.add(mItem2); subMenu = new Menu();
subMenu.add(new MenuItem("退出")); menu.add(subMenu);
mBar.add(menu); f.setMenuBar(mBar); f.setVisible(true); initEvent();
} private void initEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); mItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("第一个响应了");
JOptionPane.showMessageDialog(null, "这是第一个菜单的响应");
}
}); mItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("第二个响应了");
JOptionPane.showMessageDialog(null, "这是第二个菜单的响应");
}
});
}
}

二、创建文件对话框

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; class FileDlgDemo {
FileDlgDemo() {
init();
} private Frame f;
private MenuBar mBar;
private Menu fileMenu;
private MenuItem openItem, saveItem, closeItem;
private TextArea txtArea; private FileDialog openFileDlg; // 文件打开对话框
private FileDialog saveFileDlg; // 文件保存对话框
private File file; private void init() {
f = new Frame("记事本");
f.setBounds(50, 50, 400, 200); mBar = new MenuBar();
fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出"); fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem); mBar.add(fileMenu); f.setMenuBar(mBar); f.setVisible(true); openFileDlg = new FileDialog(f, "文件打开对话框", FileDialog.LOAD);
saveFileDlg = new FileDialog(f, "文件保存对话框", FileDialog.SAVE);
txtArea = new TextArea();
f.add(txtArea); initEvent();
} private void initEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); // 打开
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
openFileDlg.setVisible(true); String driStr = openFileDlg.getDirectory();
String fileName = openFileDlg.getFile(); // System.out.println(driStr+":"+fileName);
BufferedReader br = new BufferedReader(new FileReader(
driStr + fileName)); String str = null;
while ((str = br.readLine()) != null) {
txtArea.append(str + "\r\n");
} br.close();
} catch (Exception ex) {
ex.printStackTrace();
} }
}); // 文件保存
saveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
saveFileDlg.setVisible(true); String dirStr = saveFileDlg.getDirectory();
String fileName = saveFileDlg.getFile();
if (fileName != null && dirStr != null) {
file = new File(dirStr, fileName); BufferedWriter bw = new BufferedWriter(new FileWriter(file));
String content = txtArea.getText();
bw.write(content); bw.close();
}
} catch (Exception ex) {
ex.printStackTrace();
} }
}); } } public class Test30 { public static void main(String[] args) {
new FileDlgDemo(); } }

三、Swing 简介和Swing 窗体

AWT组件最大的缺陷是它依赖于操作系统,Swing组件是在AWT组件基础上发展而来,是纯Java组件。

在Swing编程中,有一些经常要使用到的组件,其中包括:

1.JFrame(窗体,框架)

2.JButton(按钮)

3.JLabel(标签)

4.JTextField(文本框)

...

JFrame组件用于在Swing程序中创建窗体;

== JFrame 类的构造函数

JFrame()    创建新窗体,该窗体初始为不可见

JFrame(String title)    创建新窗体,使用参数title指定标题,该窗体初始为不可见

== JFrame 类的常用方法

void setTitle(String title)    设置窗体标题,标题内容由参数title指定

void setSize(int width, int height)    设置窗体的大小,参数width指定宽度,参数height指定高度,单位为像素

void setResizable(boolean resizable)    设置窗体能否调整大小,由参数resizable决定

void setVisible(boolean b)    设置窗体是否为可见,由参数b决定,true为可见,false为不可见

Container getContentPane()    获得当前窗体的内容面板

不能把组件直接添加到Swing窗体中,其含有内容面板容器,应把组件添加到内容面板中;

不能为swing窗体设置布局,而应当为swing窗体中的内容面板设置布局

void setDefaultCloseOperation(int operation)    设置窗体在关闭时默认执行的操作

void dispose()    释放当前窗体及其所有子组件所占用的资源,即卸载窗体

void repaint()    重新绘制当前窗体

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    退出时结束程序  //重要

代码应用例子:

import javax.swing.JFrame;

//一个简单的窗体示例
class MyFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L; public MyFrame() {
this.setTitle("这是个JFrame窗体");
this.setSize(300, 200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 正确的关闭窗体
} } class Test31 {
public static void main(String[] args) {
new MyFrame();
}
}

四、内容面板

一个完整的窗体是由外部框架和内容面板两部分组成的;外部框架是指由标题栏和四边所组成空心边框,它主要用来控制窗体的大小和外观;我们实际操作的是内容面板,如设置窗体的背景色,设置窗体的布局,往窗体中添加其它组件等等;我们不能直接在 JFrame 上增加子部件和部局管理器,使用getContentPane方法获得当前窗体的内容面板,该方法的返回值是Container(容器)类对象(实际上应该是JRootPane类对象,可以强转),如:

Container contentPane = getContentPane();

Container类在java.awt包中。

Container类通常用于操作JFrame的内容面板,其常用的方法有:

void setBackground(Color bg)    设置容器的背景色,由参数bg指定颜色

void setLayout(LayoutManager mgr)    设置容器的布局,参数是布局管理器

Component add(Component comp)    往容器中添加一个组件

Component add(Component comp, int index)    将指定组件添加到容器中的指定位置上

void remove(Component comp)    从容器中移除指定的组件

void removeAll()    从容器中移除所有组件

void repaint()    重新绘制当前容器

代码应用示例:

import java.awt.Color;
import java.awt.Container; import javax.swing.JFrame; //例子
class ContentPaneDemo extends JFrame {
public ContentPaneDemo() {
super("内容面板示例"); // 设置标题
Container c = this.getContentPane(); // 得到内容面板
c.setBackground(Color.CYAN); // 背影设成青绿色
this.setSize(300, 400);
this.setResizable(false); // 窗体固定大小
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class Test32 {
public static void main(String[] args) {
new ContentPaneDemo();
}
}

附: Color类

Color类用于创建颜色对象,其构造方法共有7种重载方式,以下是常用的几种:

Color(int r, int b, int g)

Color类中还提供一系列静态的颜色常量 例如 :Color.BLACK

五、常用控件

1.JButton类

JButton()    创建一个空按钮

JButton(String text)    创建一个带文本的按钮

JButton(Icon icon)    创建一个带图标的按钮

JButton(String text, Icon icon)    创建一个带文本和图标的按钮

super("内容面板示例");   //设置标题
Container c=this.getContentPane(); //得到内容面板
c.setBackground(Color.CYAN); //背影设成青绿色 c.setLayout(new FlowLayout());
Icon icon=new ImageIcon("src/8.gif");
JButton btn=new JButton("按纽名称",icon);
c.add(btn); this.setSize(300,400);
this.setResizable(false); //窗体固定大小
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

附加:常用方法

void setText(String text)    设置按钮上的文本

String getText()    获得按钮上的文本

void setBackground(Color bg)    设置按钮的背景色

Color getBackground()    获得按钮的背景色

void setEnabled(boolean b)    设置启用(或禁用)按钮,由参数b决定

void setVisible(boolean b)    设置按钮是否为可见,由参数b决定

void setToolTipText(String text)    设置按钮的悬停提示信息

void setMnemonic(int mnemonic)    设置按钮的快捷键

2.JLabel

既可以显示文本,也可以显示图像;

JLabel()    创建一个空的标签

JLabel(String text)    创建一个带文本的标签

JLabel(String text, int ha)    创建一个带文本的标签,并指定其对齐方式,可以是JLabel.LEFT、JLabel.CENTER和JLabel.RIGHT

JLabel(Icon image)    创建一个带图像的标签

JLabel(Icon image, int ha)    创建一个带图像的标签,并指定其对齐方式

JLabel(String text, Icon image, int ha)    创建一个带文本和图像的标签,并指定其对齐方式

void setText(String text)    设置标签上的文本

String getText()    获得标签上的文本

void setIcon(Icon icon)    设置标签中的图像

Icon getIcon()    获得标签中的图像

void setHorizontalAlignment(int alignment)    设置标签中文本的对齐方式

void setVisible(boolean b)    设置标签是否为可见

3.JTextFiel

JTextField()    创建一个空的文本框

JTextField(String text)    创建一个带文本的文本框

JTextField(int columns)    创建一个指定列数的空文本框

JTextField(String text, int columns)    创建一个带文本,并指定列数的文本框

void setText(String text)    设置文本框中的文本

String getText()    获得文本框中的文本

void setHorizontalAlignment(int alignment)    设置文本框中文本的对齐方式,可以是JTextField.LEFT、JTextField.CENTER和JTextField.RIGHT

void setEditable(boolean b)    设置文本框是否可以编辑,由参数b决定

void setEnabled(boolean enabled)    设置启用(或禁用)文本框

void setVisible(boolean b)    设置文本框是否为可见

4.JPanel

JPanel提供面板组件,它是轻量级的容器组件;

面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套;

JPanel类的构造方法有4种重载方式,以下是常用的几种:

JPanel()    创建一个空面板

JPanel(LayoutManaer layout)    创建带有指定布局的面板

JPanel(面板)的操作方式与Container(内容面板)很相似,以下是一些常用方法

void setBackground(Color bg)    设置面板的背景色,由参数bg指定颜色

void setLayout(LayoutManager mgr)    设置面板的布局,参数是布局管理器

Component add(Component comp)    往面板中添加一个组件

Component add(Component comp, int index)    将指定组件添加到面板中的指定位置上

void remove(Component comp)    从面板中移除指定的组件

void removeAll()    从面板中移除所有组件

void repaint()    重新绘制当前面板

相关应用的代码示例:

例一:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel; class EventDemo extends JFrame {
private JLabel lblMsg;
private JButton btn; EventDemo() {
lblMsg = new JLabel("请点击下面的按钮..");
btn = new JButton("请点击"); Container c = this.getContentPane();
c.setLayout(new BorderLayout()); c.add(btn, BorderLayout.CENTER);
c.add(lblMsg, BorderLayout.NORTH); this.setTitle("这是窗体标题"); btn.addActionListener(new MyActionListener()); this.setSize(300, 400);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
lblMsg.setText("按钮被点击了,我的内容变了");
}
} } class Test33 {
public static void main(String[] args) {
new EventDemo();
}
}

例二:

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel; public class EventDemo extends JFrame {
private JLabel lblMsg;
private JButton btnClick1;
private JButton btnClick2; public EventDemo() {
lblMsg = new JLabel("请点击下面的按钮...");
btnClick1 = new JButton("确定");
btnClick2 = new JButton("取消");
Container cpMe = getContentPane();
cpMe.setLayout(new FlowLayout());
cpMe.add(lblMsg);
cpMe.add(btnClick1);
cpMe.add(btnClick2);
setTitle("ActionListener Demo");
btnClick1.addActionListener(new MyListener());
btnClick2.addActionListener(new MyListener()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
setResizable(false); // 设置不允许用户自行调整窗口大小
setVisible(true);
} class MyListener implements ActionListener {
public void actionPerformed(ActionEvent ae) { // 实现事件处理函数
((JButton) e.getSource()).setEnabled(false); // 禁用被点击的按钮
if (ae.getSource() == btnClick1) {
lblMsg.setText("确定!");
}
if (ae.getSource() == btnClick2) {
lblMsg.setText("取消!");
}
}
} public static void main(String[] args) {
new EventDemo();
} }

六、java 图形坐标系统和图形上下文

java中,对大部分图形,文本,图像的操作方法都定义在 Graphics 类中,它是java.awt程序包的一部分

1)屏幕坐标系统 略

2)图形上下文,也称为图形环境

允许用户在屏幕上绘制图形的信息,它由 Graphics 类封装,表示一个绘制图层,它提供了绘制3种图形对象(形状,文本,图象)

Graphics 类的对象可以通过 Component 类的 getGraphics() 方法获得。

在游戏程序中,常在 paint()方法内获得 Graphics类对象,paint() 方法是Component提供的一个方法,当系统需要重绘组件时,会调用该方法,该方法只有一个参数,就是 Graphics 类的实例。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JFrame; class MyFrameAA extends JFrame {
MyFrameAA() {
this.setTitle("一个游戏程序");
this.setSize(300, 200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
repaint();
} });
} @Override
public void paint(Graphics g) {
super.paint(g);
System.out.println("paint 方法被调用了");
Color c = new Color(127, 200, 250);
g.setColor(c);
g.drawString("这是带颜色的字体", 100, 50);
g.drawRect(60, 70, 80, 80);
g.drawLine(0, 0, 90, 90);
}
} class Test34 {
public static void main(String[] args) {
new MyFrameAA();
}
}

七、绘制动画

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics; import javax.swing.JFrame;
import javax.swing.JPanel; class GamePanel extends JPanel implements Runnable {
GamePanel() {
Thread t = new Thread(this);
t.start();
} private int yPos = -80; @Override
public void paint(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.green);
g.fillOval(90, yPos, 80, 80);
} @Override
public void run() {
while (true) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
} yPos += 5;
if (yPos > this.getHeight()) {
yPos = -80;
}
repaint();
}
}
} class MyWindow extends JFrame {
MyWindow() {
this.setTitle("游戏");
Container c = this.getContentPane();
c.add(new GamePanel());
this.setBounds(150, 150, 300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
} class Test35 {
public static void main(String[] args) {
new MyWindow();
}
}

八、定时器

Timer 组件可以定时执行任务

Timer(int delay,ActionListener l)

--start()

--stop()

--restart();

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.text.SimpleDateFormat; import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer; class TimerDemo extends JFrame implements ActionListener {
private JLabel lblMsg = new JLabel("这是原始值");
private Timer timer; TimerDemo() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 400);
this.add(lblMsg); // 直接添到窗体上 timer = new Timer(1000, this);
timer.start(); this.setVisible(true); } public void actionPerformed(ActionEvent e) {
String str = new SimpleDateFormat("hh-mm-ss").format(new Date(eventMask));
lblMsg.setText(str);
} } class Test35 {
public static void main(String[] args) {
new TimerDemo();
}
}

Java基础——GUI编程(四)的更多相关文章

  1. java基础—GUI编程(一)

    一.AWT介绍

  2. java基础—GUI编程(二)

    一.事件监听

  3. Java基础——GUI编程(一)

    一.定义 GUI全称是Graphical User Interface,即图形用户界面.JDK中提供了AWT 和 Swing 两个包,用于GUI程序的设计和开发. 1.java .awt  abstr ...

  4. Java基础——GUI编程(三)

    接着前两篇学习笔记,这篇主要介绍布局管理器和对话框两部分内容. 一.布局管理器 先拿一个小例子来引出话题,就按照我们随意的添加两个按钮来说,会产生什么样的效果,看执行结果. import java.a ...

  5. Java基础——GUI编程(二)

    一.事件监听机制 -- 事件源:awt 或swing包中的那些图形界面组件,即发生事件的组件 -- 事件:Event  用户对组件的一个操作 -- 监听器:Listener  负责处理事件的方法 二. ...

  6. 1.JAVA之GUI编程概述

          下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                             ...

  7. 10.JAVA之GUI编程弹出对话框Dialog

    在上节基础上添加对话框显示错误信息. 代码如下: /*弹出对话框显示错误信息,对话框一般不单独出现,一般依赖于窗体.*/ /*练习-列出指定目录内容*/ import java.awt.Button; ...

  8. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

  9. 【Java】GUI编程

    GUI编程 前言 某koukou老师的任务罢了,好在狂神老师居然有GUI的课,只能说是有救星了. [狂神说Java]GUI编程入门到游戏实战 最好笑的是,老师要求掌握的居然是14年的知识,就连狂神在上 ...

随机推荐

  1. 转MySQL遇到的语法差异及解决方案

    最近公司项目需要从SQL Server转到MySQL, 在转的过程中遇到两者语法之间的一些差异,在网上找了解决方案后,特记录在此.由于解决方案可能有很多种,我只记录了自己使用过的,仅作参考. 1. 拼 ...

  2. Android SDK Mangaer 需要下载的组件

    以 Windows 下为例,安装完 Android SDK 后,可以看到 SDK 的目录结构如下: 其中: SDK Manager.exe 是 Android SDK 的管理工具, AVD Manag ...

  3. WinForm中DataGridView的使用(一) - 基本使用

    数据绑定 直接指定源数据(List<T>):this.DataSource = data; 通常也可以直接指定DataTable类型的数据 DataTable dt = new DataT ...

  4. 通过EntityFramework操作sqlite(DbFirst)

    记录一下通过 EntityFramework6 来操作sqlite过程 环境: visual studio 2017 .net 4.5 Console Application(项目类型) sqlite ...

  5. Linux系统VIM编辑器管理(2)

    VI/VIM模式概述 在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了,与微软的 Windows 系统不同的是,如果你用惯了 ...

  6. PHP中eval函数的危害与正确禁用方法

    其实 eval()是无法用php.ini中的 disable_functions禁止掉的 :eval是zend的,因此不是PHP_FUNCTION 函数: 如果想禁掉eval可以用php的扩展 Suh ...

  7. Android逆向——smali复杂类解析

    i春秋作家:HAI_ 之前在Android逆向——初识smali与java类中讲解了基本的HelloWorld和简单类.这节课就要进一步深入.如果能够耐下心来分析一定会有所收获.——写给自己和后来人. ...

  8. 关于c++类的一些知识的总结

    1.经常会听到“类的声明.类的定义.类的实现”,它们之间有什么不一样? 经过查阅https://www.cnblogs.com/kkshaq/p/4660073.html博客的说法,类的声明是在.h文 ...

  9. css实现图片垂直居中

    1.行高 == 高度:已知图片的高宽 <div style="text-align: center; width: 500px;height:200px; line-height:20 ...

  10. Shell 流程控制 if while for

    if else if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if [ $(p ...