⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 custommapdialog.java

📁 Java项目开发与毕业设计指导 朱福喜, 黄昊编著 清华大学出版社 项目2
💻 JAVA
字号:
package ant;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import util.Position;

/** 自定义地图对话框 */
public class CustomMapDialog extends Dialog {
	private String path;
	private Image image;
	private Map map = null;

	private FileDialog browseDialog;
	public CustomMapDialog(Shell parent) {
		super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
	}

	public CustomMapDialog(Shell parent, int style) {
		super(parent, style);
	}
	
	public void setPath(String s) {
		path = s;
	}
	
	public String getPath() {
		return path;
	}
	
	public Map open() {
		Shell shell = new Shell(getParent(), getStyle());
		shell.setText("自定义地图");
		
		createContents(shell);
		shell.pack();
		shell.open();
		Display display = getParent().getDisplay();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		return map;
	}
	
	/** 设置界面 */
	private void createContents(final Shell shell) {
		GridLayout shellLayout = new GridLayout();
		shellLayout.numColumns = 2;
		shell.setLayout(shellLayout);
		
		browseDialog = new FileDialog(shell, SWT.OPEN);
		browseDialog.setFilterNames(new String[] {
			"24 bit Bitmap (*.bmp)"
		});
		browseDialog.setFilterExtensions(new String[] {"*.bmp"});
		
		Label prompt = new Label(shell, SWT.LEFT);
		final Text input = new Text(shell, SWT.BORDER);
		Button browse = new Button(shell, SWT.PUSH);
		Label note = new Label(shell, SWT.LEFT | SWT.WRAP);
		Button ok = new Button(shell, SWT.PUSH);
		Button cancel = new Button(shell, SWT.PUSH);
		
		GridData promptData = new GridData();
		promptData.horizontalAlignment = GridData.FILL;
		promptData.horizontalSpan = 2;
		prompt.setLayoutData(promptData);
		prompt.setText("选择要转换为地图的位图文件:");
		
		GridData inputData = new GridData();
		inputData.widthHint = 300;
		inputData.verticalAlignment = GridData.CENTER;
		input.setLayoutData(inputData);
		input.setText("");
		
		GridData browseData = new GridData();
		browseData.widthHint = 65;
		browse.setLayoutData(browseData);
		browse.setText("浏览…");
		browse.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				path = browseDialog.open();
				if(path != null) input.setText(path);
			}
		});
		
		GridData noteData = new GridData();
		noteData.horizontalAlignment = GridData.FILL;
		noteData.horizontalSpan = 2;
		note.setLayoutData(noteData);
		note.setText("注意:\n" +
				"此功能只适用于24位位图。任何在300x300像素范围外的数据将被忽略。\n" +
				"黑色像素对应障碍物,红色像素为出发地,绿色像素为目的地。\n" +
				"未在水平或垂直方向连接的像素将被视为可通过。");
		
		GridData okData = new GridData();
		okData.widthHint = 65;
		okData.horizontalAlignment = GridData.END;
		ok.setLayoutData(okData);
		ok.setText("确定");
		ok.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				if(path != null) {
					image = new Image(shell.getDisplay(), path);
					map = convert(image);
					shell.close();
				}
			}
		});
		
		GridData cancelData = new GridData();
		cancelData.widthHint = 65;
		cancel.setLayoutData(cancelData);
		cancel.setText("取消");
		cancel.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				map = null;
				shell.close();
			}
		});
	}

	/** 将位图转换为地图 */
	private Map convert(Image image) {
		Map map = new Map();
		ImageData imageData = image.getImageData();
		int[] lineData = new int[Map.WIDTH];
		for(int y = 0; y < Map.HEIGHT; y++) {
			imageData.getPixels(0, y, Map.WIDTH, lineData, 0);
			for(int x = 0; x < Map.WIDTH; x++) {
				int pixelValue = lineData[x];
				if(pixelValue == 0x000000)
					map.grid[x][y] = Map.BLOCKED;
				else if(pixelValue == 0x0000ff)
					map.setStart(new Position(x, y));
				else if(pixelValue == 0x00ff00)
					map.setDest(new Position(x, y));
			}
		}
		return map;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -