1.实验目的
(1)掌握图形用户界面基本组件。
(2)了解如何使用布局管理器对组件进行管理。
(3)掌握Java事件处理机制。
2.实验内容
实验题1
编写一个模拟计算器的程序,使用面板和网格布局,添加一个文本框,10个数字按钮(0-9),4个加减乘除按钮,一个等号按钮,一个清除按钮,要求将计算公式和结果显示在文本框中。
[基本要求] 编写完整程序
package bag01;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class Calculator extends JFrame{
public
static int fun(String s)
{
int tmp=0,i=0,result=0;
while(i='0'&&s.charAt(i)<='9')
{
tmp=tmp*10+s.charAt(i)-'0';
i++;
}
result=tmp;
for( ;i
{
char exp=s.charAt(i);
i++;
tmp=0;
while(i='0'&&s.charAt(i)<='9')
{
tmp=tmp*10+s.charAt(i)-'0';
i++;
}
if(exp=='+') result=result+tmp;
else if(exp=='-') result-=tmp;
else if(exp=='*') result*=tmp;
else if(exp=='/') result/=tmp;
else result++;
}
return result;
}
Calculator()
{
super("计算器");
setResizable(true);
setBounds(100,100,300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel viewPanel=new JPanel();
getContentPane().add(viewPanel,BorderLayout.NORTH);
final JTextField textField=new JTextField();
textField.setEditable(true);
textField.setHorizontalAlignment(SwingConstants.LEFT);
textField.setColumns(18);
viewPanel.add(textField);
viewPanel.setBounds(0,0,200,200);
JPanel buttonPanel=new JPanel();
GridLayout gridLayout=new GridLayout(4,0);
gridLayout.setVgap(10);
gridLayout.setHgap(10);
buttonPanel.setLayout(gridLayout);
getContentPane().add(buttonPanel,BorderLayout.CENTER);
String [][]names={{"1","2","3","+"},
{"4","5","6","-"},
{"7","8","9","*"},
{"0","清除","=","/"}};
JButton[][] buttons=new JButton[4][4];
//定义监听器
class ButtonAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
JButton button=(JButton) e.getSource();
String name=e.getActionCommand();
int n;
if(name=="清除")
textField.setText("");
else if(name=="=")
{
String str=textField.getText();
n=fun(str);
textField.setText(str+"="+String.valueOf(n));
}
else
{
name=textField.getText()+name;
textField.setText(name);
}
}
}
for(int row=0;row
for(int col=0;col
{
buttons[row][col]=new JButton(names[row][col]);
buttons[row][col].addActionListener(new ButtonAction());
buttonPanel.add(buttons[row][col]);
}
super.setLocation(300,100);
super.setVisible(true) ;
}
public
static void main(String args[])
{
new Calculator();
}
}
实验题2
编写一个程序,有一个窗口,该窗口为BorderLayout布局。窗口的中心添加一个Panel容器:pCenter,pCenter的布局是7行7列的GridLayout布局,pCenter的中放置49个标签,用来显示日历。窗口北面添加一个Panel容器pNorth,其布局是FlowLayout布局,pNorth放置两个按钮:nextMonth和previousMonth按钮,单击nextMonth,可以显示当前月的下一个月的日历;单击previousMonth按钮,可以显示当前月的上一个月的日历。窗口的南面添加一个Panel容器pSouth,其布局是FlowLayout布局,pSouth中放置一个标签用来显示一些信息。运行结果如图所示。
图3.8 运行结果图
[基本要求] 编写完整程序。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Calender extends JFrame implements ActionListener,
ItemListener {
private static final long serialVersionUID = 1L;
public static void main(String args[]) {
try {
Calender
frame = new Calender();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
private Date date = new Date();
private GregorianCalendar gregorianCalendar = new
GregorianCalendar();
private String[] stringWeek = new String[] { "SUN", "MON",
"TUE", "WED",
"THU",
"FRI", "SAT" };
private String[] stringWeekCn = new String[] { "星期天", "星期一",
"星期二", "星期三",
"星期四",
"星期五", "星期六" };
private String[] stringMonth = new String[] { "Jan", "Feb",
"Mar", "Apr",
"May",
"Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec" };
private String[] strSysTime = new String[6];
// 存储当前日期信息
private String[] strSysNowTime = new String[6];
// 存储运行时日期信息
private JButton[] buttonDay = new JButton[42];
private JButton[] buttonWeek = new JButton[7];
private JLabel labelMonth = new JLabel();
private JButton buttonLastMonth = new JButton();
private JButton buttonNextMonth = new JButton();
private JPanel pCenter=new JPanel();
private JPanel pNorth=new JPanel();
private JPanel pSouth=new JPanel();
private JLabel time=new JLabel();
public Calender() {
super("Calender");
setBounds(250, 200, 600,
500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buttonLastMonth.setText("上月");
buttonLastMonth.addActionListener(this);
pNorth.add(buttonLastMonth);
buttonNextMonth.setText("下月");
buttonNextMonth.addActionListener(this);
pNorth.add(buttonNextMonth);
getContentPane().add(pNorth,BorderLayout.NORTH);
getContentPane().add(pCenter,BorderLayout.CENTER);
pCenter.setLayout(new
GridLayout(7,7));
for (int i = 0; i
< 7; i++) {
buttonWeek[i] = new JButton();
buttonWeek[i].setText(stringWeekCn[i]);
pCenter.add(buttonWeek[i]);
}
for (int i = 0; i
< 42; i++) {
buttonDay[i] = new JButton();
buttonDay[i].setText("");
pCenter.add(buttonDay[i]);
}
getContentPane().add(pSouth,BorderLayout.SOUTH);
//time.setText("232323");
pSouth.add(time);
//time.addAncestorListener(this);
this.setResizable(true);
getSysNowTimeInfo();
setNowDate();
ShowTime();
}
public void ShowTime()
{
time.setText("日历:"+String.valueOf(getYear())+"年"+String.valueOf(getMonth())+"月");
}
public void setSysDate(int year, int month) {
// 将日期设置为year年month月1日
gregorianCalendar.set(year,
month, 1);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() ==
buttonLastMonth) {
setDate(-1);
ShowTime();
} else {
setDate(1);
ShowTime();
}
}
public void itemStateChanged(ItemEvent arg0) {
setDate(0);
}
public void getSysNowTimeInfo() {
//
得到程序运行时的时间信息并存储在字符串数组strSysNowTime中
date =
gregorianCalendar.getTime();
strSysNowTime = (date +
"").split(" ");
}
public void getSysTimeInfo() {
//
得到系统当前的时间信息并存储在字符串数组strSysTime中
date =
gregorianCalendar.getTime();
strSysTime = (date +
"").split(" ");
}
public int getNowMonth() {
int month = 0;
for (int i = 0; i
< 12; i++) {
if
(strSysNowTime[1].equalsIgnoreCase(stringMonth[i])) {
month = i;
break;
}
}
return month;
}
public int weekStrat(String strWeek) {
//
返回字符串strWeek与星期中的第几天匹配,SUN为第一天
int strat = 0;
for (int i = 0; i
< 7; i++) {
if
(strWeek.equalsIgnoreCase(stringWeek[i])) {
strat = i;
break;
}
}
return strat;
}
int year,month;
public void setNowDate() {
// 将时间设置为程序运行时的时间
setSysTime(getNowYear(),
getNowMonth());
getSysTimeInfo();
setDayNull();
getDay(getMonthDays(getNowYear(), getNowMonth() - 1),
getMonthDays(
getNowYear(), getNowMonth()), weekStrat(strSysTime[0]),
getNowDay());
year=getNowYear() -
1900;
month=getNowMonth();
}
public void setDate(int move) {
//
将时间设置为选中的年月增加move个月之后的时间
setSysTime(getYear(),
getMonth() + move);
getSysTimeInfo();
setDayNull();
getDay(getMonthDays(getYear(), getMonth() + move - 1),
getMonthDays(
getYear(), getMonth() + move), weekStrat(strSysTime[0]), -1);
if (move != 0) {
if
(getMonth() == 0 && move
< 0) {
move = 11;
year=getNowYear() - 1901;
} else if
(getMonth() == 11 && move
> 0) {
move = -11;
year=getNowYear() - 1899;
} else
{
year=getNowYear() - 1900;
}
month=getMonth() + move;
}
}
public void setSysTime(int year, int month) {
gregorianCalendar.set(year,
month, 1);
}
public int getNowYear() {
return
Integer.parseInt(strSysNowTime[5]);
}
public int getNowDay() {
return
Integer.parseInt(strSysNowTime[2]);
}
public int getYear() {
return year+ 1900;
}
public int getMonth() {
return month;
}
public void setDayNull() {
for (int d = 0; d
< 42; d++) {
buttonDay[d].setText("");
}
}
public void getDay(int lastMonDays, int monthDays, int
startWeek, int day) {
// 设置日期颜色并打印
for (int d = 0; d
< startWeek + 1; d++) {
buttonDay[d].setForeground(Color.GRAY);
buttonDay[d].setText((lastMonDays - startWeek) + d + 1 + "");
}
for (int d = startWeek; d
< startWeek + monthDays; d++) {
buttonDay[d].setForeground(Color.red);
buttonDay[d].setText(d - startWeek + 1 + "");
}
for (int d = monthDays +
startWeek; d < 42; d++) {
buttonDay[d].setText(d - (monthDays + startWeek) + 1 + "");
}
}
public int getMonthDays(int year, int month) {
// 返回year年month月的天数
switch (month) {
case 3:
case 5:
case 8:
case 10:
return
30;
case 1:
if
(gregorianCalendar.isLeapYear(year)) {
return 29;
} else
{
return 28;
}
default:
return
31;
}
}
}
实验题3 实现如图6.2所示的布局方式
功能:前两个文本框输入整型数据。第三个文本框存放前两个文本框数据之和。
要求如下:
第一个文本框的数据是[100,200],如果超出该范围弹出对话框提示用户。弹出提示对话框的时刻是光标离开第一个文本框时。
图3.9 求和
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TextFieldtest extends JFrame
{
public static void main(String []argv)
{
JFrame frame=new TextFieldtest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
JTextField first=new JTextField();
JTextField second=new JTextField();
JTextField result=new JTextField();
int n,m;
TextFieldtest()
{
super("TextFieldTest");
setBounds(250, 200, 400, 200);
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
first=new JTextField("input integer1");
second=new JTextField("input integer2");
result=new JTextField("Get the Result");
//添加鼠标事件,使鼠标离开first时候检查*/
first.addMouseListener(new MouseHander(first));
second.addMouseListener(new MouseHander(second));
result.addMouseListener(new MouseHander(result));
//添加鼠标事件,方便输入数据和计算结果
result.addMouseMotionListener(new MouseMotionHander());
second.addMouseMotionListener(new MouseMotionHander());
first.setColumns(30);
second.setColumns(30);
result.setColumns(30);
add(first);
add(second);
add(result);
}
private class MouseHander extends MouseAdapter
{
public MouseHander(JTextField c)
{
current=c;
}
public void mousePressed(MouseEvent event)
{
if(current==result)
{
double firstNumber=Double.parseDouble(first.getText());
double secondNumber=Double.parseDouble(second.getText());
double Result=firstNumber+secondNumber;
result.setText(""+Result);
}
else current.setText("");
}
private JTextField current;
}
private class MouseMotionHander extends MouseMotionAdapter
{
public void mouseMoved(MouseEvent event)
{
double number=Double.parseDouble(first.getText());
if(number<100||number>200)
{
int type=JOptionPane.ERROR_MESSAGE;
JOptionPane.showMessageDialog(null,new
String("输入数字必须在100~200之间"),"提示", 2);
}
}
}
}
实验题4
编写一个显示图像文件的Application应用程序,在该程序JFrame窗体中添加JPanel面板和一个JToolBar工具栏,在工具栏上添加一个JButton“打开”按扭,单击“打开”按纽,弹出JFileChooser文件打开选择对话框,选择图像文件后将其显示在JPnel面板中。
package loncyKao.choosejpg;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class Photo extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private String filePath = "";
JToolBar toolBar = new JToolBar("工具栏");
JButton
open = new JButton("Open");
JButton
exit = new JButton("Exit");
JPanel
panel = new JPanel();
JPanel
viewPanel = new JPanel();
public Photo(){
super("图片查看器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(panel,BorderLayout.NORTH);
open.setHorizontalAlignment(JButton.CENTER);
open.addActionListener(this);
exit.addActionListener(this);
exit.setHorizontalAlignment(JButton.CENTER);
toolBar.setFloatable(true);
toolBar.add(open);
toolBar.add(exit);
panel.add(toolBar);
viewPanel.setLayout(new BorderLayout());
getContentPane().add(viewPanel,BorderLayout.SOUTH);
setBounds(200,200,500,300);
setVisible(true);
}
public
void actionPerformed(ActionEvent e)
{
String
action = e.getActionCommand();
if(e.getSource()==exit) System.exit(0);
JFileChooser fileChooser = new JFileChooser();
int index = fileChooser.showOpenDialog(getContentPane());
if(index == JFileChooser.APPROVE_OPTION)
{
File selectedFile =
fileChooser.getSelectedFile(); //取得选中的文件
filePath = selectedFile.getPath();
filePath = filePath.replace('\\','/');
ImageIcon
icon = new ImageIcon(filePath);
JLabel label = new JLabel(icon,JLabel.CENTER);
//JLabel label = new JLabel("图片路径:" +
filePath,icon,JLabel.LEFT);
JLabel p=new JLabel("图片路径:" + filePath);
viewPanel.add(p,BorderLayout.SOUTH);
viewPanel.add(label);
viewPanel.update(null);
}
}
public static void main(String [] args){
Photo ph = new Photo();
}
}