南昌航空大学实验报告
2021 年 12 月 3 日
课程名称: 面向对象程序设计B 实验名称: 用户图形界面
学号: 姓名: 同组人:
指导教师评定: 签名:
一、实验目的
1、了解JavaFX的基本原理和基本组件;
2、能够熟练应用JavaFX组件进行界面设计;
3、掌握Java的事件驱动机制、lambda表达式;
4、掌握shape形状类的使用。
二、实验要求
1、 根据实验步骤中提出的要求,使用eclipse等开发工具编写相应的Java程序;
2、 编译、运行自己所编写的Java程序;
3、 根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;
4、 记录实验中遇到的各类问题并以及解决办法。
三、实验步骤
1、 请修改实验四农夫过河游戏的代码,将用户界面改为图形界面,界面效果自行设计。
设计方法:主要改动的一个是Main方法,把按钮的控制等等代码都加到这里面,其次则是class MaterialObject,class Game,主要改动也是因为添加了按钮,剩下的都与实验四的代码差不多,举个例子如下所示:
和
2、 请画出修改后的类图,并说明在界面中使用了哪些技巧以达到较好地界面效果。
四、实验结果
开始:
若失败:
若是成功:
五、实验小结
通过这次学会了Javafx的使用,实话说,感觉这里蛮难的,里面好多方法的使用都要去学习,去琢磨,通过查阅资料,浏览他人优质的代码去学习,去改进,整个实验进行的很曲折,功能也有些不完善,但是总体而言还是收获很大的,javafx里面的按钮事件驱动机制、lambda表达式等等,还有很多值得去学习。
六、附录
package jxceshi;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.HashSet;
public class Main extends Application {
GridPane pane = new GridPane();
Game user = new Game();
@Override
public void start(Stage stage) {
pane.setAlignment(Pos.CENTER);
pane.setPadding(new Insets(5,2,2,2));
pane.setHgap(3.5);
pane.setVgap(3.5);
//加入图片效果
Image image = new Image("file:F:\\图片\\河.jpg");
ImageView imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(410.5);
imageView.setFitWidth(110);
pane.add(imageView,1,0,1,4);
//加入按键
Button bt = new Button("农夫独自过河");
bt.setMinSize(110,30);
ButtonEvents handle = new ButtonEvents(1);
bt.setOnAction(handle);
pane.add(bt,0,4);
bt = new Button("农夫带狼过河");
bt.setMinSize(110,30);
handle = new ButtonEvents(2);
bt.setOnAction(handle);
pane.add(bt,1,4);
bt = new Button("农夫带羊过河");
bt.setMinSize(110,30);
handle = new ButtonEvents(3);
bt.setOnAction(handle);
pane.add(bt,0,5);
bt = new Button("农夫带菜过河");
bt.setMinSize(110,30);
handle = new ButtonEvents(4);
bt.setOnAction(handle);
pane.add(bt,1,5);
/*bt = new Button("退出游戏");
bt.setMinSize(110,63.5);
handle = new ButtonEvents(0);
bt.setOnAction(handle);
pane.add(bt,2,4,1,2);*/
pane=user.play(pane,-1);
Scene scene = new Scene(pane);
stage.setTitle("农夫过河");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
class ButtonEvents implements EventHandler<ActionEvent> {
int flag;
ButtonEvents(int i)
{
this.flag=i;
}
@Override
public void handle(ActionEvent event) {
if(flag==0)
System.exit(0);
else
pane=user.play(pane,flag);
}
}
}
abstract class MaterialObject
{
String type;
String place;
boolean isExit;
MaterialObject()
{
this.place = "Left";
isExit = true;
}
void diedOut()
{
this.isExit=false;
}
boolean isExit()
{
return this.isExit;
}
void showStatus(GridPane pane)
{
Image image;
ImageView imageView;
switch(this.type)
{
case "Farmer":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,0);
image = new Image("file:F:\\图片\\农夫.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,0);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,0);
image = new Image("file:F:\\图片\\农夫.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,0);
}
break;
case "Wolf":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,2);
image = new Image("file:F:\\图片\\狼.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,2);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,2);
image = new Image("file:F:\\图片\\狼.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,2);
}
break;
case "Sheep":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,1);
image = new Image("file:F:\\图片\\羊.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,1);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,1);
image = new Image("file:F:\\图片\\羊.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,1);
}
break;
case "Cabbage":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,3);
image = new Image("file:F:\\图片\\白菜.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,3);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,3);
image = new Image("file:F:\\图片\\白菜.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,3);
}
break;
}
}
void setSize(ImageView imageView,Image image)
{
imageView.setImage(image);
imageView.setFitHeight(100);
imageView.setFitWidth(110);
}
}
class Animal extends MaterialObject
{
HashSet<String> recipe = new HashSet<String>();
boolean eat(MaterialObject object,MaterialObject farmer)
{
if(canBeEat(object,farmer))
{
object.diedOut();
return true;
}
else
return false;
}
void addedToRecipe(MaterialObject object)
{
this.recipe.add(object.type);
}
boolean isFood(MaterialObject object)
{
if(recipe.contains(object.type))
return true;
else
return false;
}
boolean canBeEat(MaterialObject object,MaterialObject farmer)
{
if(isFood(object)&&object.place.equals(this.place)&&!farmer.place.equals(this.place))
return true;
else
return false;
}
}
class Person extends MaterialObject
{
}
class Plant extends MaterialObject
{
}
abstract class AbstractTransport
{
String place;
int capacity;
AbstractTransport()
{
this.place="Left";
this.capacity=2;
}
ArrayList<MaterialObject> goodses = new ArrayList<MaterialObject>();
void moveTo()
{
if(this.place.equals("Left"))
{
this.place="";
this.place="Right";
}
else
{
this.place="";
this.place="Left";
}
}
}
class Boat extends AbstractTransport
{
void crossRiver()
{
int i;
for(i=0;i<goodses.size();i++)
{
if(goodses.get(i).place.equals("Left"))
{
goodses.get(i).place="";
goodses.get(i).place="Right";
}
else
{
goodses.get(i).place="";
goodses.get(i).place="Left";
}
}
moveTo();
}
void board(MaterialObject object)
{
goodses.add(object);
capacity--;
}
void disembark()
{
goodses.clear();;
capacity=2;
}
}
abstract class AbstractGame
{
GameOverRule gameOverRule=new GameOverRule();
GameSuccessRule gameSuccessRule=new GameSuccessRule();
GameData gameData=new GameData();
abstract GridPane play(GridPane pane,int choice);
}
class Game extends AbstractGame
{
GameUI UI = new GameUI();
CrossRiverRule rule = new CrossRiverRule();
int over=0;
GridPane play(GridPane pane,int choice)
{
switch(choice)
{
case 1:
gameData.boat.board(gameData.farmer);
gameData.boat.crossRiver();
gameData.boat.disembark();
break;
case 2:
if(rule.hasCross(gameData.wolf, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.wolf);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 3:
if(rule.hasCross(gameData.sheep, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.sheep);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 4:
if(rule.hasCross(gameData.cabbage, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.cabbage);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 0:
over=1;
break;
}
pane=UI.showStatus(gameData,pane);
Image image;
ImageView imageView;
if(over==1)
{
image = new Image("file:F:\\图片\\输.jpg");
imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(410.5);
imageView.setFitWidth(337);
pane.add(imageView,0,0,3,4);
}
if(gameOverRule.judge(gameData))
{
pane.getChildren().clear();
if(gameSuccessRule.judge(gameData))
image = new Image("file:F:\\图片\\胜利.jpg");
else
image = new Image("file:F:\\图片\\输.jpg");
imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(417.5);
imageView.setFitWidth(337);
pane.add(imageView,0,0,3,4);
}
return pane;
}
}
class GameUI
{
GridPane showStatus(GameData gameData,GridPane pane)
{
gameData.farmer.showStatus(pane);
gameData.wolf.showStatus(pane);
gameData.sheep.showStatus(pane);
gameData.cabbage.showStatus(pane);
return pane;
}
}
class GameData
{
MaterialObject farmer = new Person();
Animal wolf = new Animal();
Animal sheep = new Animal();
MaterialObject cabbage = new Plant();
Boat boat = new Boat();
public GameData()
{
farmer.type="Farmer";
wolf.type="Wolf";
sheep.type="Sheep";
cabbage.type="Cabbage";
wolf.addedToRecipe(sheep);
sheep.addedToRecipe(cabbage);
}
}
abstract class AbstractRule
{
abstract boolean judge(GameData gameData);
}
class CrossRiverRule extends AbstractRule
{
boolean hasCross(MaterialObject object,Boat boat)
{
if(!object.place.equals(boat.place))
return false;
else
return true;
}
@Override
boolean judge(GameData gameData) {
if(gameData.farmer.place.equals("Right")&&gameData.wolf.place.equals("Right")&&gameData.sheep.place.equals("Right")&&gameData.cabbage.place.equals("Right"))
return true;
else
return false;
}
}
class ObjectExitRule extends AbstractRule
{
@Override
boolean judge(GameData gameData) {
if(gameData.wolf.eat(gameData.sheep, gameData.farmer)||gameData.sheep.eat(gameData.cabbage, gameData.farmer))
return false;
else
return true;
}
}
class GameOverRule extends AbstractRule
{
GameSuccessRule win = new GameSuccessRule();
ObjectExitRule live = new ObjectExitRule();
@Override
boolean judge(GameData gameData) {
if(win.judge(gameData)||!live.judge(gameData))
return true;
else
return false;
}
}
class GameSuccessRule extends AbstractRule {
CrossRiverRule cross = new CrossRiverRule();
ObjectExitRule live = new ObjectExitRule();
@Override
boolean judge(GameData gameData) {
if (cross.judge(gameData) && live.judge(gameData))
return true;
else
return false;
}
}