|
第十三章 图形界面
一、ATW和Swing简介
(1)AWT简介
AWT:Abstract Windowing Toolkit抽象窗口工具包,一般调用原生代码调用操作系统的图形功能实现图形界面的显示。
组件是Java图形用户界面最基本的组成元素
组件是一个以图形化方式显示在屏幕上且在需要时和用户进行交互的对象。
容器是可以容纳其他容器和组件的组件。
其中的Frame类可以产生一个带有标题及边框的图形界面窗体,是一个容器,可以容纳其他容器或者组件,使用该代码产生的窗口风格是使用的操作系统自身的窗口风格。
import java.awt.*;
public class TestFrame {
public static void main(String[] args)
{
Frame f = new Frame("AWT 窗口示例");
f.setSize(100,100);
f.setVisible(true);
}
}
(2)Swing简介
GUI开发工具集,构筑与AWT之上的GUI组件,提供了更多的组件,提供了更多的性能。
import javax.swing.*;
public class TestSwing {
public static void main(String[] args)
{
JFrame f = new JFrame("Swing window example");
f.setSize(500, 300);
f.setVisible(true);
}
}(这个代码显示出来的窗口按窗口的关闭键可以将窗口关闭,上面那个不行,但是窗口关闭不等于程序终止)
import javax.swing.*;
public class TestSwing {
public static void main(String[] args)
{
JFrame f = new JFrame("Swing window example");
//try
//{
UIManager.getSystemLookAndFeelClassName();//UIManager的方法可以对窗口风格进行操作,如果使用UIManager.getLookAndFeel("com.sum.java.swing.plaf.motif.MotifLookAndFeel就会需要被注释的try and catch
// }
/* catch(ClassNotFoundException cnf)
{
cnf.printStackTrace(System.err);
}
catch(UnsupportedLookAndFeelException ula)
{
ula.printStackTrace(System.err);
}
catch( IllegalAccessException iae)
{
iae.printStackTrace(System.err);
}
catch( InstantiationException ie)
{
ie.printStackTrace(System.err);
}*/
f.setSize(500, 300);
f.setVisible(true);
}
}
二、Swing容器及组件
(1)Swing容器---JFrame,JPanel
import javax.swing.*;
public class TestJFrameAndPanel extends JFrame
{
public TestJFrameAndPanel()
{
super("英汉电子词典");
setSize(300,400);
setCtrl();//调用方法
}
public void setCtrl()
{
JPanel pane = new JPanel();//产生一个版面的实例
pane.setSize(300,100);//设定版面大小
add(pane,"North");//将面板添加到窗体之中,参数North表明要在窗体上部。
}
public static void main(String[] args)
{
TestJFrameAndPanel tfa = new TestJFrameAndPanel();
tfa.setVisible(true);
}
}
(2)Swing组件
英文名 | 中文名 |
JLable | 标签 |
JTextField | 文本框 |
JButton | 按钮 |
JTextArea | 文本域 |
1.JLable
通常用于显示一段提示性的信息或图标。
2.可以用JLable构造器来进行,也可以用JLable方法。
构造器:
JLable()
JLable(Icon image)
JLable(Icon image,int horizontalAlignment)
JLable(String text)
JLable(String text, int horizontalAlignment)
JLable(String text, Icon icon, int horizontalAlignment)
Image:表示要在标签中显示的图片
text表示要在标签上显示的文字
horizontalAlignment表示标签在水平方向上的对齐方式,能够指定的值是SwingConstants中的常量LEFT,CENTER,RIGHT,LEADING,TRAILING
Icon(是一个接口)和ImageIcon(是Icon一个常用的实现类)都在包 javax.swing中
import javax.swing.*;
public class TestJLable {
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setSize(400, 240);
JLabel lbll = new JLabel("加油,我亲爱的庄~");
f.add(lbll,"North");
ImageIcon icon = new ImageIcon("F:/图/CrazyPudding/Java1.jpg");
JLabel lbl2 = new JLabel(icon);
f.add(lbl2,"Center");
JLabel lbl3 = new JLabel("我爱你~",icon,SwingConstants.RIGHT);
f.add(lbl3,"South");
f.setVisible(true);
}
}
3.JTextField
提供编辑单行文本的功能.
方法 | 功能 |
setColumns | 设定它的列数 |
setHorizontalAlignment | 设定字体 |
setFont | 设定文本的水平对齐方式 |
getText | 可以取得当前对象中的文字,最终要的方法,继承于JTextComponent |
4.JButton
可以显示一个按钮,按钮上可以显示指定的文字或图标,或不显示。最常用的功能是当用户单击它时执行一定的功能,完成特定的任务
构造器:
JButton()
JButton(Action a)
JButton(String text)
JButton(String text,Icon icon)
Action 类型的参数表明要通过Action来配置按钮,并可以一定程度上的控制
text 表明在按钮上显示的文字
icon 表明在按钮上显示的图标
在不指定按钮大小的情况下,按钮将尽可能地填充它所在的区域。
import javax.swing.*;
public class TestButton {
public static void main(String[] args)
{
JFrame f = new JFrame("testing button");
f.setSize(400,200);
JButton bt1 = new JButton("comparing to the pain of regret,i prefer the pain of hardworking");
f.add(bt1,"North");
ImageIcon icon = new ImageIcon("F:/图/CrazyPudding/Java1.jpg");
JButton bt2 = new JButton(icon);
f.add(bt2,"Center");
JButton bt3 = new JButton("i love my family",icon);
f.add(bt3, "South");
f.setVisible(true);
}
}
5.JTextArea
提供显示和编辑多行纯文本的功能,在需要的时候可以通过滚动条来移动其中可以显示的出来的部分内容。
在产生JTextArea的时候,可以指定这个实例的行数和列数,不过这里指定的行数和列数通常只是一个首选项,会随包容它的容器以及输入的文本进行自动调整。
import javax.swing.*;
public class TestJFrameAndPanel extends JFrame
{
public TestJFrameAndPanel()
{
super("英汉电子词典");
setSize(300,400);
setCtrl();
}
public void setCtrl()
{
JPanel pane = new JPanel();
pane.setSize(400,100);
add(pane,"North");
JLabel lb = new JLabel("eglish word");
pane.add(lb);//按照加入的顺序从左至右,貌似
JTextField tf = new JTextField(20);
pane.add(tf);
JButton bt = new JButton("search");
pane.add(bt);
JTextArea ta = new JTextArea();
add(ta,"Center");//这里为什么可以直接add?
}
public static void main(String[] args)
{
TestJFrameAndPanel tfa = new TestJFrameAndPanel();
tfa.setVisible(true);
}
}
(3)其他容器和组件简介
1. JScrollPane
提供滚动条。
import javax.swing.*;
import java.awt.*;
public class TestJScrollPane {
public static void main(String[] args)
{
JFrame f = new JFrame("testing JScrollPane");
f.setSize(400,200);
JPanel p = new JPanel();
p.setLayout(new GridLayout(10,10));//为P指定布局管理器
for(int i =0; i<100;i++)
{
p.add(new JButton("按钮"+i));在p中添加100个按钮
}
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;//表示垂直滚动条只有在需要时显示
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(p,v,h);//一般不把组件添加到JScrollPane中,直接添加的话需要使用 JViewPort
f.add(jsp);
f.setVisible(true);
}
}
ScrollPaneConstants接口中常量 | 意思(水平方向的常量名就是把垂直的vertical换成horizontal,意思和英文的对应) |
VERTICAL_SCROLLBAR_AS_NEED | 滚动条在需要的时候使用 |
VERTCAL_SCROLLBAR_NEVER | 从不出现 |
VERTICAL_SCROLLBAR_ALWAYS | 一直出现 |
2. JList
import javax.swing.*;
public class TestList {
public static void main(String[] args)
{
JFrame f = new JFrame("testing list");
f.setSize(150,130);
String[] data = {"California","New York","Seattle"};
JList ls = new JList(data);
f.add(ls);
f.setVisible(true);
}
}
setSelectionMode 可以通过一个整型参数来设定列表中的选项可以选择多少个
该整型参数可以是ListSelectionModel中的常量
常量名 | 意思 |
SINGLE_SELECTION | 允许选择列表中的一项 |
SINGLE_INTERVAL_SELECTION | 允许选择多项,但是这些多项必须是连续的 |
MULTIPLE_INTERVAL_SELECTION | 允许选择多项,但是多项可以不是连续的 |
取得列表中的选项
方法getSelccedIndex 在列表只允许选择单项时可以通过它获得选中项的索引(有多个时,返回索引最小的)
getSelectedIndices 在列表允许多选时,返回一个int类型的数组,数组将按照升序的方式包含所有选中项的索引
getSelectedValue 获得选中项的值(因为只能返回(Object)一个所以在有多个的情况下返回索引最小的值)
getSelectedValues 获得多个选中的值(返回Object数组)
3. JComboBox
import java.awt.*;
import javax.swing.*;
public class TestJComboBox {
public static void main(String[] args)
{
JFrame f = new JFrame("testing JComeBox");
f.setLayout(new FlowLayout());
f.setSize(400,500);
String[] data = {"California","New York","Seattle"};
JComboBox cb = new JComboBox(data);
f.add(cb);
f.setVisible(true);
}
}
该组件提供方法 setEditable 可以设定当前JComboBox是否支持编辑功能
取得JComboBox对象的选定值的操作与JList是类似的,相关的方法有getSelectedIndex,getSelectedItem,getSelectedObjects
4. JCheckBox
复选框是一个可以显示被选中或者取消选中的图形组件。每一个复选框是一个独立的对象,相互之间不影响,可以多选。
在构建JCheckBox实例的时候,可以通过构造器参数指定复选框显示的文本内容以及指定初始状态(选择或者不选择)
如果希望显示图标,可以使用带有Icon参数的构造器来构建其对象
import java.awt.*;
import javax.swing.*;
public class TestJCheckBox {
public static void main(String[] args)
{
JFrame f = new JFrame("testing JCheckBox...");
f.setLayout(new FlowLayout());
f.setSize(300,100);
JCheckBox jb1 = new JCheckBox("上海",true);//这个调用的是可以输入文本和指定状态的构造器
f.add(jb1);
JCheckBox jb2 = new JCheckBox("广东");
f.add(jb2);
JCheckBox jb3 = new JCheckBox("北京");
f.add(jb3);
f.setVisible(true);
}
}
5. JRadioButton
只能选一个
import java.awt.*;
import javax.swing.*;
public class TestJRadioButton {
public static void main(String[] args)
{
JFrame f = new JFrame("Testing JRadioButton....");
f.setLayout(new FlowLayout());
f.setSize(400,500);
ButtonGroup bg = new ButtonGroup();
JRadioButton rb = new JRadioButton("California");
bg.add(rb);
f.add(rb);
JRadioButton rb1 = new JRadioButton("New York");
bg.add(rb1);
f.add(rb1);
JRadioButton rb2 = new JRadioButton("Seattle");
bg.add(rb2);
f.add(rb2);
f.setVisible(true);
}
}
6. JOptionPane
import java.awt.*;
import javax.swing.*;
public class TestJOptinPane {
public static void main(String[] args)
{
JFrame f = new JFrame("TESTING JOPTIONPANE...");
//f.setLayout(new FlowLayout());
f.setSize(400,500);
f.setVisible(true);
int ret;
ret = JOptionPane.showConfirmDialog(null, "您确认要退出程序么?","确认对话框示例",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
System.out.println(ret);
String inStr;
inStr = JOptionPane.showInputDialog(null,"请输入你的姓名","输入对话框显示",JOptionPane.QUESTION_MESSAGE);
System.out.println(inStr);
JOptionPane.showMessageDialog(null,"程序出现异常","消息框显示",JOptionPane.ERROR_MESSAGE);
}
}
图标常量 | 对应的图标 |
ERROR_MASSAGE |
|
INFORMATION_MESSAGE |
|
WARNING_MESSAGE |
|
QUESTION_MESSAGE |
|
PLAIN_MESSAGE | 无图标 |
按钮常量 |
|
DEFAULT_OPTION |
|
YES_NO_OPTION |
|
YES_NO_CANCEL_OPTION |
|
OK_CANCEL_OPTION |
|
对话框返回值常量 | 含义 |
YES_OPTION | 通过单击“是”按钮关闭对话框 |
NO_OPTION | 通过单击“否”按钮关闭对话框 |
CANCEL_OPTION | 通过单击“取消”按钮关闭对话框 |
OK_OPTION | 通过单击“确定”按钮关闭对话框 |
CLOSED_OPTION | 通过单击右上角的“关闭”按钮关闭对话框 |
三、Java事件模型
(1)事件处理机制简介
事件、事件源、事件处理器
事件:用户对图形用户界面上的图形元素做的操作
事件源:是某个事件发生的来源;例如用户点击了某个按钮,那么产生单击按钮这个事件的事件源便是这个按钮
事件处理器:当事件发生后对这个事件进行处理的一个Java方法。
包含事件处理器的类叫做事件监听器
(2)事件监听器
事件监听器是完成事件响应和处理的核心部分。
如果希望在单击右上角“关闭”按钮时结束程序,首先要实现接收窗口时间的侦听器接口WindowListener,同时在实现WindowListener中的windowClosing方法时执行退出程序的指令。
监听器一个是监听按钮的行为,一个是监听窗口的按钮(放大缩小关闭什么的)
代码另查
(3)事件适配器
适配器是针对接口定义的实现类,为对应接口中的所有方法提供了一个空的实现。如果只是扩展对应接口的适配器的话,就可以直接重写想实现的方法而不管其他方法,这样可以节省代码。(奇怪的是当初设置接口就是为了在实现多态的同时还可以扩展类,现在又变成间接的扩展接口了)
主要的适配器 | 所实现的接口 |
ComponentAdapter | ComponentListener,EventListener |
ContainerAdapter | ContainerListener,EventListener |
HierarchyBoundsAdapter | HierarchyBoundsListener,EventListener |
KeyAdapter | EventListener,KeyListener |
MouseAdapter | EventListener,MouseListener,MouseMotionListener,MouseWheelListener |
MouseMotionAdapter | EventListener,MouseMotionListener |
WindowAdapter | EventListener,WindowFocusListener,WindowStateListener,WindowListener |
FocusAdapter | EventListener,FocusListener |
四、布局管理器
(1)布局管理器概述
布局管理器均在java.awt包中,使用布局管理器使得组件的布局趋于自动化。
(2)BorderLayout
是默认的布局管理器,以方向为依据,将容器划分为东西南北中五个部分。
import java.awt.*;
import javax.swing.*;
public class TestBorderLayout {
public static void main(String[] args)
{
JFrame jf = new JFrame("Testing BorderLayout");
jf.setLayout(new BorderLayout());//因为是默认的,所以删掉这句话也不会有什么影响
jf.setSize(120,120);
jf.add(new Button("east"),"East");//如果不设置方位,就默认为放在中间,多个默认就都放在中间,先定义的被覆盖
jf.add(new Button("west"),"West");
jf.add(new Button("north"),"North");
jf.add(new Button("south"),"South");
jf.add(new Button("meddle"),"Center");//如果将这行注释掉别的位置的按钮不会来填补这一区域,但是其他任意按钮(可以多个按钮被同时注释,但是多个里面不能包括中间这个)被注释掉都有其他的按钮来填补空白
jf.setVisible(true);
}
}
(3)FlowLayout
是流式布局管理器,是从左到右,从上到下的顺序依次进行排列,当容器大小发生改变时,容器里面组件的位置也会发生改变
import java.awt.*;
import javax.swing.*;
public class TestFlowLayout {
public static void main(String[] args)
{
JFrame f = new JFrame("Testing FlowLayout");
f.setLayout(new FlowLayout());
f.setSize(100,200);
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.add(new Button("6"));
f.add(new Button("7"));
f.add(new Button("8"));
f.add(new Button("9"));
f.setVisible(true);
}
}
(4)GridLayout
以网格作为布局的基本框架,将容器划分为若干网格,然后将组件从左到右从上到下,依次将组件添加到网格中
import java.awt.*;
import javax.swing.*;
public class TestGridLayout {
public static void main(String[] args)
{
JFrame f = new JFrame("Testing FlowLayout");
f.setLayout(new GridLayout(2,8));//第一个参数是行,第二个参数是列,也可以不输入参数,则默认为一行,此外输入参数并不是所有的时候都会按照参执行
f.setSize(100,200);
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.add(new Button("6"));
f.add(new Button("7"));
f.add(new Button("8"));
f.add(new Button("9"));
f.setVisible(true);
}
}
(5)其他
CardLayout 优点,在有限空间包容更多的组件
GridBagLayout 不需要组件大小相同便可以将组件垂直、水平或沿它们的基线对齐。
五、为窗口添加菜单
(1)Java菜单简述
JMenuBar 包括 JMenu; JMenu 包括 JMenuItem。
JMenuBar的方法
方法 | 功能 |
|
|
|
|
|
|
JMenu的方法
方法 | 功能 |
add | 添加JMenuItem对象(该方法有5个重载方法,也可以将String ,Action, Component作为构造参数) |
insert | 将需要的菜单项组件添加到JMenu中 |
addSeparator/insertSeparator | 为菜单添加分隔 |
set | 对菜单属性进行操作 |
get | 取得菜单属性的值 |
isSelected | 判断菜单项是否处于选中状态 |
isMenuComponent | 判断参数中指定的组件是否存在于当前的JMune对象之中 |
remove | 对菜单项或者组件进行删除 |
JMenuItem的重载器
构造器 | 功能 |
JMnuItem() | 创建不带文本和图标的JMnuItem |
JMnuItem(Action a) | 创建从指定的Action获取属性的菜单项 |
JMnuItem(Icon icon) | 创建带有指定图标的JMnuItem |
JMnuItem(String text) | 创建带有指定文本的JMnuItem |
JMnuItem(String text, Icon icon) | 创建带有指定文本和图标的JMnuItem |
JMnuItem(String text, int mnemonic) | 创建带有指定文本和键盘助记符的JMnuItem |
(2)为英汉电子词典添加菜单
添加菜单的代码另查
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-17 13:07
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.