package com.wing.game.mapeditor; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.SnapshotParameters; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.RadioMenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.control.Slider; import javafx.scene.control.TextField; import javafx.scene.control.ToggleGroup; import javafx.scene.control.ListView.EditEvent; import javafx.scene.control.ToolBar; import javafx.scene.control.cell.TextFieldListCell; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; import javafx.util.Callback; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import javax.imageio.ImageIO; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import com.wing.game.mapeditor.dialog.AboutDialog; import com.wing.game.mapeditor.dialog.AlertDialog; import com.wing.game.mapeditor.dialog.NewMapDialog; import com.wing.game.mapeditor.dialog.NewMapDialog.OnNewMapDialogActionListener; import com.wing.game.mapeditor.draw.AltasCanvas; import com.wing.game.mapeditor.draw.MapCanvas; import com.wing.game.mapeditor.io.XMLElements; import com.wing.game.mapeditor.layer.TiledMapLayer; import com.wing.game.mapeditor.property.AltasResourceManager; import com.wing.game.mapeditor.property.TileProperty; import com.wing.game.mapeditor.property.AltasResourceManager.AltasResource; import com.wing.game.mapeditor.property.TiledMap; /** * 主界面事件处理 * * @author Wing Mei */ public class MainLayoutController implements Initializable { @FXML private TextField importImagePathTf; @FXML private TextField importImageWidthTf, importImageHeightTf, importImageSizeTf; @FXML private ListView<String> layerListView; private FileChooser fileChooser; @FXML private Button browserImportBtn, addToImageBtn; @FXML private ToolBar layerToolbar; @FXML private Slider layerAlphaSlider; @FXML private Slider scaleSlider; @FXML private Label mScaleLabel; @FXML private CheckBox layerShowCheck, layerColliderCheck; @FXML private Label mapSizeLabel, nowMousePositionLabel; @FXML private ScrollPane altasCanvasScrollPane; @FXML private ScrollPane mapScrollPane; @FXML private ListView<String> altasListView; @FXML private RadioMenuItem normalBrushItem, paintPailItem, eraserItem, rectItem; @FXML private CheckMenuItem showMapGridItem, showAltasGridItem; // private int altasOffsetX = 0; // private int altasOffsetY = 0; private ObservableList<String> layerList = FXCollections.observableArrayList(); private ObservableList<String> imagePathList = FXCollections.observableArrayList(); private Image nowBrowserImage; private List<TiledMapLayer> tiledMapLayerList = new ArrayList<>(); private AltasCanvas altasCanvas; private MapCanvas mapCanvas; private SimpleStringProperty nowSelectAltasIdProperty = new SimpleStringProperty(); private SimpleIntegerProperty brushTypeProperty = new SimpleIntegerProperty(); private FileChooser openMapChooser; private FileChooser saveAsFileChooser; private FileChooser exportFileChooser; private NewMapDialog newMapDialog; private SAXReader saxReader = new SAXReader(); // 打开地图是否报错 private boolean isReadError = false; // 是否打开或者新建地图 private boolean isNewOrOpenMap = false; // 读取地图返回的信息 private List<String> readMsgs = new ArrayList<>(); // 绘制线程休眠时间 private long threadSleep = 50; private File openMapFile; private Thread drawThread = new Thread(new Runnable() { @Override public void run() { while (isRunning) { Platform.runLater(new Runnable() { @Override public void run() { if (altasCanvas != null) { altasCanvas.draw(); } if (mapCanvas != null) { mapCanvas.draw(); if (isNewOrOpenMap && layerList.size() > 0) nowMousePositionLabel.setText(mapCanvas.getMouseCols() + " , " + mapCanvas.getMouseRows()); } } }); try { Thread.sleep(threadSleep); } catch (InterruptedException e) { e.printStackTrace(); } } } }); public static boolean isRunning = true; @Override public void initialize(URL location, ResourceBundle resources) { TiledMap.getInstance().setMapProperty(64, 64, 13, 7); // 文件选择器 fileChooser = new FileChooser(); fileChooser.getExtensionFilters().add(new ExtensionFilter("图片文件", "*.jpg", "*.png", "*.bmp")); altasCanvas = new AltasCanvas(altasCanvasScrollPane.getWidth(), altasCanvasScrollPane.getHeight()); altasCanvas.BrushTypeProperty().bind(brushTypeProperty); // 打开地图 openMapChooser = new FileChooser(); openMapChooser.getExtensionFilters().add(new ExtensionFilter("地图文件", "*.xml")); saveAsFileChooser = new FileChooser(); saveAsFileChooser.getExtensionFilters().add(new ExtensionFilter("XML文件", "*.xml")); exportFileChooser = new FileChooser(); exportFileChooser.getExtensionFilters().add(new ExtensionFilter("图片文件", "*.png")); // 贴图集绘制 altasCanvas.widthProperty().bind(altasCanvasScrollPane.widthProperty()); altasCanvas.heightProperty().bind(altasCanvasScrollPane.heightProperty()); altasCanvasScrollPane.setContent(altasCanvas); // 地图绘制 mapCanvas = new MapCanvas(TiledMap.getInstance().getMapWidth(), TiledMap.getInstance().getMapHeight()); mapCanvas.NowSelectLayerProperty().bind(layerListView.getSelectionModel().selectedIndexProperty()); mapCanvas.BrushTypeProperty().bind(brushTypeProperty); mapCanvas.setMapLayerList(tiledMapLayerList); mapCanvas.NowChooseProperty().bind(altasCanvas.NowChooseProperty()); // mapCanvas.ScaleProperty().bind(scaleSlider.valueProperty()); scaleSlider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { String value = newValue.toString().subSequence(0, 3).toString(); mScaleLabel.setText(value); mapCanvas.setScale(newValue.doubleValue()); double width = TiledMap.getInstance().getRealTileMapWidth() * mapCanvas.getScale(); double height = TiledMap.getInstance().getRealTileMapHeight() * mapCanvas.getScale(); mapCanvas.setWidth(width); mapCanvas.setHeight(height); } }); mapScrollPane.setContent(mapCanvas); drawThread.start(); // 图层列表 layerListView.setItems(layerList); layerListView.setEditable(true); layerListView.setCellFactory(TextFieldListCell.forListView()); layerListView.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() { @Override public void handle(EditEvent<String> event) { layerList.set(event.getIndex(), event.getNewValue()); tiledMapLayerList.get(event.getIndex()).setLayerName(event.getNewValue()); } }); layerListView.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { int index = newValue.intValue(); if (index >= 0 && index < tiledMapLayerList.size()) { TiledMapLayer mapLayer = tiledMapLayerList.get(index); layerAlphaSlider.setValue(mapLayer.getAlpha()); layerShowCheck.setSelected(mapLayer.isVisible()); layerColliderCheck.setSelected(mapLayer.isCollider()); } } }); // 图层alpha值的修改 layerAlphaSlider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { int index = layerListView.getSelectionModel().selectedIndexProperty().get(); if (index >= 0 && index < tiledMapLayerList.size()) { TiledMapLayer mapLayer = tiledMapLayerList.get(index); mapLayer.setAlpha(newValue.doubleValue()); } } }); layerShowCheck.selectedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { int index = layerListView.getSelectionModel().selectedIndexProperty().get(); if (index >= 0) { TiledMapLayer mapLayer = tiledMapLayerList.get(index); mapLayer.setVisible(newValue); } } }); layerColliderCheck.selectedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { int index = layerListView.getSelectionModel().selectedIndexProperty().get(); if (index >= 0) { TiledMapLayer mapLayer = tiledMapLayerList.get(index); mapLayer.setCollider(newValue); } } }); // 贴图集列表 altasListView.setItems(imagePathList); altasListView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call(ListView<String> param) { return new ImageCell(); } }); altasListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { AltasResource altasResource = AltasResourceManager.getInstance().getResourceById(newValue); if (altasResource != null && altasResource.getImage() != null) { Image image = altasResource.getImage(); altasCanvas.setImage(image); mapCanvas.setNowAltasResource(altasResource); } else { altasCanvas.setImage(null); mapCanvas.setNowAltasResource(null); } } }); nowSelectAltasIdProperty.bind(altasListView.getSelectionModel().selectedItemProperty()); // 对话框 newMapDialog = new NewMapDialog(); newMapDialog.setOnNewMapDialogActionListener(new OnNewMapDialogActionListener() { @Override public void onNewMapOkAction() { clearAll(); newOrOpenMap(); openMapFile = null; // 设置地图画布大小 mapCanvas.setWidth(TiledMap.getInstance().getRealTileMapWidth()); mapCanvas.setHeight(TiledMap.getInstance().getRealTileMapHeight()); mapSizeLabel.setText(TiledMap.getInstance().getMapWidth() + " x " + TiledMap.getInstance().getMapHeight()); } @Override public void onNewMapCancelAction() { } }); // 菜单 ToggleGroup tGroup = new ToggleGroup(); normalBrushItem.setToggleGroup(tGroup); paintPailItem.setToggleGroup(tGroup); eraserItem.setToggleGroup(tGroup); rectItem.setToggleGroup(tGroup); normalBrushItem.setSelected(true); mapCanvas.ShowGridProperty().bind(showMapGridItem.selectedProperty()); altasCanvas.ShowGridProperty().bind(showAltasGridItem.selectedProperty()); } /** * 清空地图 */ private void clearAll() { tiledMapLayerList.clear(); AltasResourceManager.getInstance().removeAll(); imagePathList.clear(); altasCanvas.setImage(null); layerList.clear(); readMsgs.clear(); //读取地图时清除属性列表 TiledMap.getInstance().getPropertyList().clear(); } /** * 新建或者打开地图 的UI变化 */ private void newOrOpenMap() { isNewOrOpenMap = true; browserImportBtn.setDisable(false); addToImageBtn.setDisable(false); layerToolbar.setDisable(false); } /** * 读取地图 * * @param file * 地图文件 */ private void readMap(File file) { // 清空所有资源 clearAll(); isReadError = false; try { Document document = saxReader.read(file); Element rootElement = document.getRootElement(); for (Iterator<Element> i = rootElement.elementIterator(); i.hasNext();) { Element e = i.next(); if (e.getName().equals(XMLElements.ELEMENT_MAP_SETTING)) { // 读取地图信息 int mapWidth = Integer.parseInt(e.elementText(XMLElements.ELEMENT_MAP_WIDTH)); int mapHeight = Integer.parseInt(e.elementText(XMLElements.ELEMENT_MAP_HEIGHT)); int tileWidth = Integer.parseInt(e.elementText(XMLElements.ELEMENT_TILE_WIDTH)); int tileHeight = Integer.parseInt(e.elementText(XMLElements.ELEMENT_TILE_HEIGHT)); TiledMap.getInstance().setMapProperty(tileWidth, tileHeight, mapWidth, mapHeight); // 设置地图画布大小 mapCanvas.setWidth(tileWidth * mapWidth); mapCanvas.setHeight(tileHeight * mapHeight); mapSizeLabel.setText(TiledMap.getInstance().getMapWidth() + " x " + TiledMap.getInstance().getMapHeight()); readMsgs.add("读取地图设置成功"); } else if (e.getName().equals(XMLElements.ELEMENT_MAP_RESOURCE)) { // 读取地图资源,并添加到资源管理中 AltasResourceManager.getInstance().removeAll(); for (Iterator<Element> j = e.elementIterator(); j.hasNext();) { Element ej = j.next(); String altasID = ej.elementText(XMLElements.ELEMENT_ALTAS_ID); String altasPath = ej.elementText(XMLElements.ELEMENT_ALTAS_PATH); String fileName = altasPath.substring(altasPath.lastIndexOf("\\") + 1); try { addImageAtlas(altasID, altasPath); readMsgs.add("读取贴图" + fileName + "成功"); } catch (FileNotFoundException e1) { e1.printStackTrace(); isReadError = true; readMsgs.add("贴图" + fileName + "未找到"); } } // 添加到资源列表 List<AltasResource> alResources = AltasResourceManager.getInstance().getResources(); for (AltasResource resource : alResources) { System.out.println(resource.getAltasId() + "," + resource.getPathStr() + "," + alResources.size()); imagePathList.add(resource.getAltasId()); } } else if (e.getName().equals(XMLElements.ELEMENT_MAP_DATA)) { // 读取图层数据,并转化为地图数据 for (Iterator<Element> j = e.elementIterator(); j.hasNext();) { TiledMapLayer tiledMapLayer = new TiledMapLayer(); Element ej = j.next(); String layerName = ej.attributeValue(XMLElements.ATTRIBUTE_NAME); String visibleStr = ej.attributeValue(XMLElements.ATTRIBUTE_VISIBLE); String alphaStr = ej.attributeValue(XMLElements.ATTRIBUTE_ALPHA); String colliderStr = ej.attributeValue(XMLElements.ATTRIBUTE_COLLIDER); String mapData = ej.getText(); System.out.println("读取图层:" + layerName); tiledMapLayer.setLayerName(layerName); if (visibleStr != null) tiledMapLayer.setVisible(Boolean.parseBoolean(visibleStr)); if (alphaStr != null) tiledMapLayer.setAlpha(Double.parseDouble(alphaStr)); if (colliderStr != null) tiledMapLayer.setCollider(Boolean.parseBoolean(colliderStr)); tiledMapLayer.ConvertFromString(mapData); layerList.add(layerName); // 读取的图层添加到列表中 tiledMapLayerList.add(tiledMapLayer); readMsgs.add("读取图层\"" + layerName + "\"成功"); } } else if (e.getName().equals(XMLElements.ELEMENT_MAP_PROPERTY)){ // 读取图层数据,并转化为地图数据 for (Iterator<Element> j = e.elementIterator(); j.hasNext();) { TileProperty tileProperty = new TileProperty(); Element ej = j.next(); String col = ej.attributeValue(XMLElements.ATTRIBUTE_COL); String row = ej.attributeValue(XMLElements.ATTRIBUTE_ROW); tileProperty.setCol(Integer.parseInt(col)); tileProperty.setRow(Integer.parseInt(row)); for (Iterator<Element> oj = ej.elementIterator(); oj.hasNext();) { Element property = oj.next(); String key = property.attributeValue(XMLElements.ATTRIBUTE_KEY); String value = property.attributeValue(XMLElements.ATTRIBUTE_VALUE); tileProperty.insertValue(key, value); } TiledMap.getInstance().getPropertyList().add(tileProperty); } readMsgs.add("读取地图属性列表成功"); } } } catch (DocumentException e) { e.printStackTrace(); isReadError = true; readMsgs.add("地图文件读取出错" + e.getMessage()); } } @FXML public void onNewMapAction(ActionEvent e) { newMapDialog.showAlertDialog(); } @FXML public void onOpenMapAction(ActionEvent e) { File mapFile = openMapChooser.showOpenDialog(null); if (mapFile != null) { readMap(mapFile); String str = ""; if (!isReadError) { str = "读取地图完成:"; } else { str = "读取地图过程中出错:"; } StringBuilder sb = new StringBuilder(); sb.append(str + System.getProperty("line.separator")); for (String s : readMsgs) { sb.append(s + System.getProperty("line.separator")); } newOrOpenMap(); openMapFile = mapFile; AlertDialog.showAlertDialog(sb.toString()); } } @FXML public void onSaveMapAction(ActionEvent e) { if (openMapFile == null) { File file = saveAsFileChooser.showSaveDialog(null); if (file != null) { saveMapToFile(file); } } else { saveMapToFile(openMapFile); } } @FXML public void onSaveAsMapAction(ActionEvent e) { File file = saveAsFileChooser.showSaveDialog(null); if (file != null) { saveMapToFile(file); } } @FXML public void onExportToImageAction(ActionEvent e) { File file = exportFileChooser.showSaveDialog(null); if (file != null) { WritableImage image = mapCanvas.snapshot(new SnapshotParameters(), null); try { ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file); AlertDialog.showAlertDialog("保存成功!"); } catch (IOException ex) { AlertDialog.showAlertDialog("保存失败:" + ex.getMessage()); } } } /** * 将地图保存到文件 * * @param file * 地图文件 */ private void saveMapToFile(File file) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); Document map = createSaveDocument(); XMLWriter writer; try { writer = new XMLWriter(new FileWriter(file), format); writer.write(map); writer.close(); AlertDialog.showAlertDialog("保存地图完成!"); } catch (IOException e1) { e1.printStackTrace(); AlertDialog.showAlertDialog("保存地图出错:" + e1.getMessage()); } } @FXML public void onAboutAction(ActionEvent e) { AboutDialog.showAboutDialog(); } /* * 创建保存的地图数据 */ private Document createSaveDocument() { Document document = DocumentHelper.createDocument(); Element map = document.addElement(XMLElements.ELEMENT_MAP); Element mapSetting = map.addElement(XMLElements.ELEMENT_MAP_SETTING); Element mapWidth = mapSetting.addElement(XMLElements.ELEMENT_MAP_WIDTH); mapWidth.setText(TiledMap.getInstance().getMapWidth() + ""); Element mapHeight = mapSetting.addElement(XMLElements.ELEMENT_MAP_HEIGHT); mapHeight.setText(TiledMap.getInstance().getMapHeight() + ""); Element tileWidth = mapSetting.addElement(XMLElements.ELEMENT_TILE_WIDTH); tileWidth.setText(TiledMap.getInstance().getTileWidth() + ""); Element tileHeight = mapSetting.addElement(XMLElements.ELEMENT_TILE_HEIGHT); tileHeight.setText(TiledMap.getInstance().getTileHeight() + ""); // 写入资源列表 Element mapResource = map.addElement(XMLElements.ELEMENT_MAP_RESOURCE); List<AltasResource> resources = AltasResourceManager.getInstance().getResources(); for (int i = 0; i < resources.size(); i++) { AltasResource altasResource = resources.get(i); Element resource = mapResource.addElement(XMLElements.ELEMENT_RESOURCE); Element resourceId = resource.addElement(XMLElements.ELEMENT_ALTAS_ID); resourceId.setText(altasResource.getAltasId()); Element resourcePath = resource.addElement(XMLElements.ELEMENT_ALTAS_PATH); resourcePath.setText(altasResource.getPathStr()); } Element mapData = map.addElement(XMLElements.ELEMENT_MAP_DATA); for (int i = 0; i < tiledMapLayerList.size(); i++) { TiledMapLayer mapLayer = tiledMapLayerList.get(i); Element layer = mapData.addElement(XMLElements.ELEMENT_MAP_LAYER); layer.addAttribute(XMLElements.ATTRIBUTE_NAME, mapLayer.getLayerName()); layer.addAttribute(XMLElements.ATTRIBUTE_VISIBLE, String.valueOf(mapLayer.isVisible())); layer.addAttribute(XMLElements.ATTRIBUTE_ALPHA, mapLayer.getAlpha() + ""); layer.addAttribute(XMLElements.ATTRIBUTE_COLLIDER, String.valueOf(mapLayer.isCollider())); layer.setText(mapLayer.toString()); } Element tilePropertyElement = map.addElement(XMLElements.ELEMENT_MAP_PROPERTY); ArrayList<TileProperty> tileProperties = TiledMap.getInstance().getPropertyList(); for (TileProperty tileProperty : tileProperties) { Element data = tilePropertyElement.addElement(XMLElements.ELEMENT_PROPERTY_DATA); data.addAttribute(XMLElements.ATTRIBUTE_COL, String.valueOf(tileProperty.getCol())); data.addAttribute(XMLElements.ATTRIBUTE_ROW, String.valueOf(tileProperty.getRow())); HashMap<String, String> valuesMap = tileProperty.getValueMap(); Iterator<String> keys = valuesMap.keySet().iterator(); while(keys.hasNext()){ String key = keys.next(); String value = valuesMap.get(key); Element propertyElement = data.addElement(XMLElements.ELEMENT_PROPERTY); propertyElement.addAttribute(XMLElements.ATTRIBUTE_KEY, key); propertyElement.addAttribute(XMLElements.ATTRIBUTE_VALUE, value); } } return document; } @FXML public void onBrowserImportImageAction(ActionEvent e) { File file = fileChooser.showOpenDialog(null); if (file != null) { importImagePathTf.setText(file.getAbsolutePath()); try { nowBrowserImage = new Image(new FileInputStream(file)); importImageWidthTf.setText(nowBrowserImage.getWidth() + ""); importImageHeightTf.setText(nowBrowserImage.getHeight() + ""); importImageSizeTf.setText(file.length() / 1024 + "kb"); } catch (FileNotFoundException e1) { e1.printStackTrace(); } } } @FXML public void onAddToImageAtlasAction(ActionEvent e) { if (!importImagePathTf.getText().equals("")) { String id = AltasResourceManager.createAltasId(); String path = importImagePathTf.getText(); try { addImageAtlas(id, path); imagePathList.add(id); } catch (FileNotFoundException e1) { e1.printStackTrace(); } } } private void addImageAtlas(String id, String path) throws FileNotFoundException { Image image = new Image(new FileInputStream(path)); AltasResourceManager.getInstance().addResource(id, path, image); } @FXML public void onAddNewLayerAction(ActionEvent e) { String defaultName = "新建图层"; layerList.add(defaultName); TiledMapLayer tiledMapLayer = new TiledMapLayer(); tiledMapLayer.setLayerName(defaultName); tiledMapLayerList.add(tiledMapLayer); } @FXML public void onDeleteLayerAction(ActionEvent e) { int index = layerListView.getSelectionModel().getSelectedIndex(); if (index >= 0) { layerList.remove(index); tiledMapLayerList.remove(index); } } @FXML public void onLayerUpAction(ActionEvent e) { int index = layerListView.getSelectionModel().getSelectedIndex(); if (index > 0) { String layerStr = layerList.remove(index - 1); TiledMapLayer layer = tiledMapLayerList.remove(index - 1); layerList.add(index, layerStr); tiledMapLayerList.add(index, layer); } } @FXML public void onLayerDownAction(ActionEvent e) { int index = layerListView.getSelectionModel().getSelectedIndex(); if (index < layerList.size() - 1) { String layerStr = layerList.remove(index); TiledMapLayer layer = tiledMapLayerList.remove(index); layerList.add(index + 1, layerStr); tiledMapLayerList.add(index + 1, layer); } } @FXML public void onNormalBrushItemAction(ActionEvent e) { brushTypeProperty.set(0); } @FXML public void onPaintPailItemAction(ActionEvent e) { brushTypeProperty.set(1); } @FXML public void onEraserItemAction(ActionEvent e) { brushTypeProperty.set(2); if (mapCanvas != null) { mapCanvas.NowChooseProperty().clear(); } } @FXML public void onRectItemAction(ActionEvent e) { brushTypeProperty.set(3); if (mapCanvas != null) { mapCanvas.NowChooseProperty().clear(); } } @FXML public void onDeleteResourceAction(ActionEvent e) { int index = altasListView.getSelectionModel().getSelectedIndex(); imagePathList.remove(index); AltasResourceManager.getInstance().removeResource(index); } @FXML public void onAppExit(ActionEvent e) { System.exit(0); isRunning = false; } class ImageCell extends ListCell<String> { @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { ImageView iView; Image image = AltasResourceManager.getInstance().getResourceById(item).getImage(); iView = new ImageView(image); iView.setFitWidth(50); iView.setFitHeight(50); setGraphic(iView); } else { Rectangle rectangle = new Rectangle(altasListView.getWidth(), altasListView.getHeight()); rectangle.setFill(Color.WHITE); setGraphic(rectangle); } } } }