第八章 Java GUI设计与事件处理
1、题目
1.1、 如何来制作图形界面?它需要引入哪些包
创建窗口并在窗口中添加各种组件,指定组件的属性和它们在窗口中的位置,从而构成图形界面的外观效果。定义图形界面的事件和各种组件对不同事件的响应,从而实现图形界面与用户的交互。
简而言之,制作图形界面需要引入java中的开发包,然后利用其中封装的函数与类,编写自己的类继承它们然后构造界面和界面中一系列的东西。
利用界面操作引入需要引入AWT包、Swing包等,根据需要选择其中相应的内容。
1.2、 在java中,什么是事件?简述处理事件的机制。
事件是可以被控件识别的操作。与事件源绑定的事件对象对事件源设置监听,一旦事件源有动作发生,即运行与其绑定的处理事件。
事件指一个描述事件源状态改变的对象 。java语言对事件的处理采用的是授权事件模型。在这个模型下,每个组件都有相应的事件,如按钮有单击事件,文本域具有内容改变事件等。当某个事件被触发后,组件就会将事件发送给组件注册的每一个事件监听器,事件监听器中定义了与不同事件相对应的事件的处理,此时事件监听器会根据不同的事件信息调用不同的事件处理者,完成对这次事件的处理,只有事件监听器被触发后才会收到事件信息。
1.3、 什么是布局管理器,它有什么作用?
布局管理器是控制组件在容器中位置的类的实例。其作用是将控件依据编程人员的需要排列布局。
布局管理器是一个实现Layout Manager接口的类的实例。布局管理器的作用包括设置计算容器的最佳和最小尺寸以及将容器中的组件大小和位置作合适的安排。
1.4、 请编写一个窗口来实现BorderLayout的布局。
package xiti8;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
class borderLayoutFrame extends Frame{
borderLayoutFrame(){
super("BorderLayout布局窗口测试");
Panel myPanel = new Panel();
myPanel.setLayout(new BorderLayout());
Button north = new Button("北面");
Button south = new Button("南面");
Button east = new Button("东面");
Button west = new Button("西面");
Button center = new Button("中央");
myPanel.add(north,BorderLayout.NORTH);
myPanel.add(south,BorderLayout.SOUTH);
myPanel.add(east,BorderLayout.EAST);
myPanel.add(west,BorderLayout.WEST);
myPanel.add(center,BorderLayout.CENTER);
this.add(myPanel);
this.setSize(320,240);
this.setVisible(true);
}
}
public class xiti8_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
borderLayoutFrame borfrm = new borderLayoutFrame();
borfrm.show();
}
}
1.5、 请说明FlowLayout布局方式的特点?
FlowLayout布局方式是JPanel的默认布局,组件按照加入的先后顺序从左至右排列,排满后进入下一行,默认居中排列,组件之间的默认水平和垂直间隙是5个像素,组件大小默认为最佳大小,即可以保证显示其上面的文字。。
FlowLayout的布局策略是将容器中的组件按照加入的先后顺序从左向右排列。如果一行排满转下一行继续,每行均采取居中排列。
1.6、GridLayout布局的特点有哪些?
GridLayout布局是将容器划分为若干行乘若干列的网格区域,然后组件就位于这些划分出来的小格子中,每个组件大小即格子大小,均一致。
1.7、 编写“画圆画方”的程序
惭愧,这题自己写给写乱套了,然后就参考大神的写的,附上传送门:画圆画方
http://blog.csdn.net/Jayler_May/article/details/72825582
package xiti8;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class myhuatuFrame extends JFrame{
myhuatuFrame(String str){
super(str);
this.setVisible(true);
// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭窗口
this.setSize(400, 400);
myPanel myhuatuPanel = new myPanel();//创建面板
// myhuatuPanel.setBackground(Color.yellow);
this.add(myhuatuPanel,BorderLayout.CENTER);
myhuatuPanel.addMouseListener(myhuatuPanel);//添加鼠标监视器
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
class myPanel extends JPanel implements MouseListener{
// static int X,Y;
int clickedNum = 0;
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
int X = e.getX();
int Y = e.getY();
clickedNum = e.getButton();//获取鼠标点击的次数
Graphics g = this.getGraphics();//重绘
if(clickedNum == 1) {//如果是点击左键
if(e.getClickCount() == 2) {//如果是双击左键
g.setColor(Color.white);
//g.drawOval(X, Y, 30, 30);
g.fillRect(0,0,1000,1000);
}
else if(e.getClickCount() == 1) {
g.setColor(Color.green);
//g.drawOval(X, Y, 30, 30);
g.fillOval(X,Y,10,10);
}
}
else if(clickedNum == 3) {//如果是点击右键
g.setColor(Color.red);
//g.drawRect(X,Y,30,30);
g.fillRect(X,Y,10,10);
}
}
//对mouse的各种事件的重写,自动加上的,不然报错,跟super一个道理???
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
//}
//public class xiti8_7_2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
myhuatuFrame frm = new myhuatuFrame("画圆画方");
frm.show();
}
}
//}
对照阅读:
《深入浅出MFC》,侯俊杰著,第九章。