📄 view.java
字号:
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 + -