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

📄 view.java

📁 一个简易的java画图软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				if (fileName.matches(".*\\.svg")) {
					return true;
				}
				return false;
			}
		};

		filechooser.setFileFilter(filter);
		filechooser.setFileHidingEnabled(true);
		filechooser.setMultiSelectionEnabled(false);

		int ans = filechooser.showSaveDialog(null);

		if (ans == JFileChooser.APPROVE_OPTION) {
			file = filechooser.getSelectedFile();

			String name = file.getName();
			String path = file.getAbsolutePath();
			path = path.substring(0, path.lastIndexOf(File.separatorChar));
			name = name.trim();
			if (name.matches("\".+\"")) { // 文件名两边有“”, 则不指定后缀
				name = name.replaceFirst("\"(.+)\"", "$1");
				file = new File(path + File.separatorChar + name);
			} else if (!name.matches(".+\\.{1}[A-Za-z0-9]*")) {// 没有指定后缀时指定后缀
				name = name + ".svg";
				file = new File(path + File.separatorChar + name);
			}
			try {
				file.createNewFile();
			} catch (IOException e) {
				if (Application.DEBUG > 0)
					e.printStackTrace();
				return;
			}

			canvas.paintToSVG(svg);
			svg.write(file);
		} else {
			return;
		}

	}

	private void savingView() {
		if (viewFile == null || !(viewFile.isFile() && viewFile.canWrite())) {
			System.out.println("保存文件失败,没有指定文件名称。");
			return;
		}

		try {
			ObjectOutputStream oos = new ObjectOutputStream(
					new FileOutputStream(viewFile.getAbsolutePath()));

			Vector<AbstractFiguare> figuares = getCanvas().getAllFiguares();

			for (AbstractFiguare figuare : figuares) {
				System.out.println(figuare);
				oos.writeObject(figuare);
			}
			oos.writeObject(null);
			oos.close();
		} catch (FileNotFoundException e) {
			return;
		} catch (IOException e) {
			if (Application.DEBUG > 0)
				e.printStackTrace();
			return;
		}

		canvas.putClientProperty(CANVAS_CHANGED_PROPERTY, HAS_SAVED);
		this.name = viewFile.getName();
	}

	public void load(File file) {
		canvas.removePropertyChangeListener(propertyListener);
		// TODO 从文件中读取信息,并显示在Canvas上面
		ObjectInputStream obs;
		try {
			obs = new ObjectInputStream(new FileInputStream(file
					.getAbsolutePath()));
			Object figuare;
			while ((figuare = obs.readObject()) != null) {
				getCanvas().receiveFiguare(
						new NetMessage(NetMessage.MES_NEW_FIGUARE, figuare));
			}
			obs.close();
		} catch (FileNotFoundException e) {
			if (Application.DEBUG > 0)
				e.printStackTrace();
			return;
		} catch (ClassNotFoundException e) {
			if (Application.DEBUG > 0)
				e.printStackTrace();
			return;
		} catch (IOException e) {
			if (Application.DEBUG > 0)
				e.printStackTrace();
			return;
		}
		canvas.addPropertyChangeListener(propertyListener);
	}

	// ----------------------一下用于网络通信---------------------
	/**
	 * 发送消息到外界
	 * 
	 * @param netMes
	 *            待发送的消息
	 */
	public void sendMessage(NetMessage netMes) {
		if (server != null) {
			server.sendMessage(netMes);
		} else if (client != null) {
			client.sendMessage(netMes);
		}
	}

	/**
	 * 从外界获取消息 <br/> 如果有MES_SHUTDOWN消息头,会给出网络断开提示
	 * 
	 * @param netMes
	 *            消息
	 */
	public void receiveMessage(NetMessage netMes) {
		if (netMes == null || netMes.messageContent == null) {
			if (Application.DEBUG > 6) {
				System.out.println("哪里来的空消息:View.receiveMessage()");
			}
			return;
		}
		Object obj = netMes.messageContent;
		if (netMes.messageHeader.equals(NetMessage.MES_SHUTDOWN)) {
			if (client != null) {
				// 服务器断开
				JOptionPane jop = new JOptionPane();
				jop.setVisible(true);
				client = null;
				viewPort.putClientProperty(VIEW_KIND_PROPERTY, "");
				JOptionPane.showMessageDialog(draw.app, "服务器已经断开连接。", name
						+ " 文档警告", JOptionPane.WARNING_MESSAGE);
			}
		} else {
			if (obj instanceof AbstractFiguare) // 如果是图形,就给canvas
				getCanvas().receiveFiguare(netMes);
			else if (obj instanceof String) { // 如果是字符串,给聊天面板
				getChatFrame().receiveMessage(netMes);
			}
			;
		}
	}

	/**
	 * 创建服务器
	 * 
	 * @return 成功创建返回真
	 */
	public boolean creatServer() {
		if (!IsConnected()) {
			creatIpAddr(false).setVisible(true);

			if (port == null)
				return false;

			int iPort = Integer.parseInt(port);

			server = new PaintServer(this);
			if (server.createServer(iPort)) {
				server.start();
				chatPane.setVisible(true);
				viewPort.putClientProperty(VIEW_KIND_PROPERTY, "Server");
				return true;
			} else {
				String errorInfo = server.getErrorInfo();
				errorInfo = (errorInfo == null) ? "未知错误" : errorInfo;
				JOptionPane.showMessageDialog(null, errorInfo);
				server = null;
				return false;
			}

		}
		return false;
	}

	private String addr, port;

	/**
	 * 创建客户端
	 * 
	 * @return 成功创建返回真
	 */
	public boolean creatClient() {
		if (!IsConnected()) {
			creatIpAddr(true).setVisible(true);

			if (addr == null || port == null)
				return false;

			int iPort = Integer.parseInt(port);

			client = new PaintClient(this);
			if (client.connectTo(new InetSocketAddress(addr, iPort))) {
				client.start();
				chatPane.setVisible(true);
				viewPort.putClientProperty(VIEW_KIND_PROPERTY, "Client");
				return true;
			} else {
				String errorInfo = client.getErrorInfo();
				JOptionPane.showMessageDialog(null, errorInfo);
				client = null;
				return false;
			}

		}
		return false;
	}

	/**
	 * 断开连接
	 */
	public void unConnectServer() {
		if (server != null && client != null && Application.DEBUG > 0) {
			System.out.println("此画布" + viewId + "既是个服务器又是个客户端。");
		}
		if (server == null && client == null)
			return;
		if (server != null) { // 它是个服务器
			server.sendMessage(new NetMessage(NetMessage.MES_SHUTDOWN, null));
			server = null;
			chatPane.setVisible(false);
			viewPort.putClientProperty(VIEW_KIND_PROPERTY, "");
		} else if (client != null) {
			client.sendMessage(new NetMessage(NetMessage.MES_SHUTDOWN, null));
			client = null;
			chatPane.setVisible(false);
			viewPort.putClientProperty(VIEW_KIND_PROPERTY, "");
		}
		draw.updateActionEnable();
	}

	/**
	 * 判断当前是否已连接上网络
	 * 
	 * @return 如果连接上
	 */
	public boolean IsConnected() {
		return server != null || client != null;
	}

	/**
	 * 创建IP地址输入面板
	 * 
	 * @param isClient
	 *            是否是客户端,如果不是则没有地址输入框
	 * @return IP地址输入面板
	 */
	public JDialog creatIpAddr(final boolean isClient) {
		final JDialog dialog = new JDialog();
		dialog.setTitle("输入地址");
		dialog.setModal(true);
		int height = 150;
		if (isClient)
			height = 200;
		dialog.setSize(300, height);
		dialog.setResizable(false);
		dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

		Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screenSize = kit.getScreenSize();
		int screenHeight = screenSize.height;
		int screenWidth = screenSize.width;
		Dimension frameSize = dialog.getSize();
		int frameHeight = frameSize.height;
		int frameWidth = frameSize.width;
		int centerLocationX = (screenWidth - frameWidth) / 2;
		int centerLocationY = (screenHeight - frameHeight) / 2;
		dialog.setLocation(centerLocationX, centerLocationY);

		JPanel p = new JPanel();
		dialog.add(p);

		JPanel addrP = new JPanel();
		addrP.setLayout(new FlowLayout(FlowLayout.LEFT));

		JLabel addrLabel = new JLabel("输入地址");
		final JTextField addrText = new JTextField(20);
		addrText.setText("127.0.0.1");
		
		
		addrP.add(addrLabel);
		addrP.add(addrText);

		JPanel portP = new JPanel();
		portP.setLayout(new FlowLayout(FlowLayout.LEFT));
		JLabel portLabel = new JLabel("输入端口");
		
		final JTextField portText = new JTextField(5);
		portText.setText("1234");
		portText.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent event) {
				char ch = event.getKeyChar();
				int port;
				String text = ((JTextField) event.getSource()).getText();
				if (text.length() == 0)
					port = -1;
				else
					port = Integer.parseInt(text);

				if (ch < '0' || ch > '9' || port * 10 + ch - '0' > 65535) {// 端口的范围
					event.consume();
				}
			}
		});

		portP.add(portLabel);
		portP.add(portText);

		p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));

		if (isClient)
			p.add(addrP);

		p.add(portP);

		JPanel buttonPane = new JPanel();

		JButton okButton = new JButton("输入");
		JButton cancelButon = new JButton("取消");

		buttonPane.add(okButton);
		buttonPane.add(cancelButon);

		p.add(buttonPane);

		okButton.addActionListener(new AbstractAction() {

			@Override
			public void actionPerformed(ActionEvent e) {
				String tAddr = addrText.getText().trim();
				String tPort = portText.getText().trim();
				if (isClient) {
					if (tAddr.length() > 0 && tPort.length() > 0) {
						addr = tAddr;
						port = tPort;
						dialog.setVisible(false);
					} else {
						if (tAddr.length() == 0) {
							JOptionPane.showMessageDialog(null, "请输入地址");
						} else {
							JOptionPane.showMessageDialog(null, "请输入端口号");
						}
					}
				} else {
					if (tPort.length() > 0) {
						port = tPort;
						dialog.setVisible(false);
					} else {
						JOptionPane.showMessageDialog(null, "请输入端口号");
					}
				}
			}
		});
		cancelButon.addActionListener(new AbstractAction() {

			@Override
			public void actionPerformed(ActionEvent e) {
				addr = null;
				port = null;
				dialog.setVisible(false);
			}
		});

		return dialog;
	}

	/**
	 * 属性更改监听器
	 * 
	 * @author Thihy
	 * 
	 */
	public class ViewPropertyListener implements PropertyChangeListener {

		@Override
		public void propertyChange(PropertyChangeEvent evt) {
			Object view_kind = null, shouldSave = null;
			if (evt.getPropertyName().equals(VIEW_KIND_PROPERTY)) { // 是样式更改:
				// 服务器和客户端
				view_kind = evt.getNewValue();
				if (view_kind != null) {
					viewKind = (String) view_kind;
				}
			} else if (evt.getPropertyName().equals(CANVAS_CHANGED_PROPERTY)) {// 修改了图形

				if (evt.getSource() != null) {
					JComponent comp = (JComponent) evt.getSource();

					String value = (String) comp
							.getClientProperty(CANVAS_CHANGED_PROPERTY);
					if (value.equals(HAS_SAVED)) {
						shouldSave = needSave = false;
					} else if (!value.equals("")) {
						shouldSave = needSave = true;
						if (Application.DEBUG > 8) {
							System.out.println(value);
						}
					}
					canvas.putClientProperty(CANVAS_CHANGED_PROPERTY, "");
				}
			}
			if (view_kind == null && shouldSave == null)
				return;
			String title = "";
			if (needSave) {// 需要保存则添加*
				title = "*";
			}
			title += name;
			if (!viewKind.equals("")) {
				title += "(" + viewKind + ")";
			}
			viewPort.setTitle(title);
			draw.updateActionEnable();
		}

	}

}

⌨️ 快捷键说明

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