java 画面_[转载]实验六 Java图形用户界面

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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值