📄 drawframe.java
字号:
package boya;
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
class DrawFrame extends JFrame implements ID,ActionListener,Observer{
private Draw theApp;
private JMenuBar menubar=new JMenuBar();
private JToolBar toolBar=new JToolBar();
private StatusBar statusBar=new StatusBar();
private FontDialog fontDlg;
private JMenuItem aboutItem,fontItem,customColorItem;
private JPopupMenu popup;
private FileAction newAction,openAction,closeAction,saveAction,
saveAsAction;
private TypeAction lineAction,rectangleAction,circleAction,curveAction,textAction;
private ColorAction redAction,yellowAction,greenAction,blueAction;
private Color elementColor=DEFAULT_ELEMENT_COLOR;
private int elementType=DEFAULT_ELEMENT_TYPE;
private Font font=DEFAULT_FONT;
private String frameTitle,filename=DEFAULT_FILENAME;
private File modelFile;
private boolean changed=false;
private JFileChooser files;
class FileAction extends AbstractAction{
FileAction(String name,String tooltip){
super(name);
String icons="res/"+name+".gif";
if(new File(icons).exists())
putValue(SMALL_ICON,new ImageIcon(icons));
if(tooltip!=null)
putValue(SHORT_DESCRIPTION,tooltip);
}
public void actionPerformed(ActionEvent e){
String name=(String)getValue(NAME);
if(name.equals(newAction.getValue(NAME))){
checkForSave();
theApp.insertModel(new DrawModel());
modelFile=null;
filename=DEFAULT_FILENAME;
setTitle(frameTitle+files.getCurrentDirectory()+"\\"+filename);
changed=false;
}
else if(name.equals(openAction.getValue(NAME))){
checkForSave();
File file=showDialog("打开文件","打开","读一个文件",'o',null);
if(file!=null)
openDraw(file);
}
else if(name.equals(closeAction.getValue(NAME))){
checkForSave();
System.exit(0);
}
else if(name.equals(saveAction.getValue(NAME))){
saveIt();
}
else if(name.equals(saveAsAction.getValue(NAME))){
File file=showDialog("另存为","保存","保存图片",'s',
modelFile==null?new File(
files.getCurrentDirectory(),filename):modelFile);
if(file!=null){
if(file.exists()&&!file.equals(modelFile))
if(JOptionPane.NO_OPTION==
JOptionPane.showConfirmDialog(
DrawFrame.this,file.getName()+"已存在,覆盖?",
"确认保存",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE))
return;
saveDraw(file);
}
return;
}
}
}
class ColorAction extends AbstractAction{
private Color color;
ColorAction(String name,Color color,String tooltip){
super(name);
this.color=color;
String icons="res/"+name+".gif";
if(new File(icons).exists())
putValue(SMALL_ICON,new ImageIcon(icons));
if(tooltip!=null)
putValue(SHORT_DESCRIPTION,tooltip);
}
public void actionPerformed(ActionEvent e){
elementColor=color;
statusBar.setColorPane(color);
}
}
class TypeAction extends AbstractAction{
private int typeID;
TypeAction(String name,int typeID,String tooltip){
super(name);
this.typeID=typeID;
String icons="res/"+name+".gif";
if(new File(icons).exists())
putValue(SMALL_ICON,new ImageIcon(icons));
if(tooltip!=null)
putValue(SHORT_DESCRIPTION,tooltip);
}
public void actionPerformed(ActionEvent e){
elementType=typeID;
statusBar.setTypePane(typeID);
}
}
public DrawFrame(String title,Draw theApp){
setTitle(title);
this.theApp=theApp;
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setJMenuBar(menubar);
//一级菜单
JMenu fileMenu=new JMenu("文件(F)");
JMenu elementMenu=new JMenu("图形(E)");
JMenu optionsMenu=new JMenu("选项(O)");
JMenu helpMenu=new JMenu("帮助(H)");
fileMenu.setMnemonic('F');
elementMenu.setMnemonic('E');
optionsMenu.setMnemonic('O');
helpMenu.setMnemonic('H');
//二级菜单
addMenuItem(fileMenu,newAction=new FileAction("新建","创建新文件"),KeyStroke
.getKeyStroke('N',Event.CTRL_MASK));
addMenuItem(fileMenu,openAction=new FileAction("打开","打开文件"),KeyStroke
.getKeyStroke('O',Event.CTRL_MASK));
addMenuItem(fileMenu,closeAction=new FileAction("关闭","关闭程序"),KeyStroke
.getKeyStroke('X',Event.CTRL_MASK));
fileMenu.addSeparator();
addMenuItem(fileMenu,saveAction=new FileAction("保存","保存文件"),KeyStroke
.getKeyStroke('S',Event.CTRL_MASK));
addMenuItem(fileMenu,saveAsAction=new FileAction("另存为...","文件另存为"));
fileMenu.addSeparator();
addMenuItem(elementMenu,lineAction=new TypeAction("直线",LINE,"绘制直线"),KeyStroke
.getKeyStroke('1',Event.CTRL_MASK));
addMenuItem(elementMenu,rectangleAction=new TypeAction("矩形",RECTANGLE,"绘制矩形"),KeyStroke
.getKeyStroke('2',Event.CTRL_MASK));
addMenuItem(elementMenu,circleAction=new TypeAction("椭圆",CIRCLE,"绘制椭圆"),KeyStroke
.getKeyStroke('3',Event.CTRL_MASK));
addMenuItem(elementMenu,curveAction=new TypeAction("曲线",CURVE,"绘制曲线"),KeyStroke
.getKeyStroke('4',Event.CTRL_MASK));
addMenuItem(elementMenu,textAction=new TypeAction("文字",TEXT,"输入文字"),KeyStroke
.getKeyStroke('5',Event.CTRL_MASK));
elementMenu.addSeparator();
JMenu colorMenu=new JMenu("颜色");
elementMenu.add(colorMenu);
addMenuItem(colorMenu,redAction=new ColorAction("红色",Color.red,"绘制红色"),KeyStroke
.getKeyStroke('1',Event.ALT_MASK));
addMenuItem(colorMenu,yellowAction=new ColorAction("黄色",Color.yellow,"绘制黄色"),KeyStroke
.getKeyStroke('2',Event.ALT_MASK));
addMenuItem(colorMenu,greenAction=new ColorAction("绿色",Color.green,"绘制绿色"),KeyStroke
.getKeyStroke('3',Event.ALT_MASK));
addMenuItem(colorMenu,blueAction=new ColorAction("蓝色",Color.blue,"绘制蓝色"),KeyStroke
.getKeyStroke('4',Event.ALT_MASK));
aboutItem=new JMenuItem("关于");
aboutItem.setAccelerator(KeyStroke.getKeyStroke('A',Event.CTRL_MASK));
aboutItem.addActionListener(this);
helpMenu.add(aboutItem);
fontItem=new JMenuItem("字体选择");
fontItem.setAccelerator(KeyStroke.getKeyStroke('T',Event.CTRL_MASK));
fontItem.addActionListener(this);
optionsMenu.add(fontItem);
customColorItem=new JMenuItem("颜色选择");
customColorItem.setAccelerator(KeyStroke.getKeyStroke('R',Event.CTRL_MASK));
customColorItem.addActionListener(this);
optionsMenu.add(customColorItem);
menubar.add(fileMenu);
menubar.add(elementMenu);
menubar.add(optionsMenu);
menubar.add(helpMenu);
//工具栏的设置
toolBar.add(newAction);
toolBar.add(openAction);
toolBar.add(saveAction);
toolBar.addSeparator();
toolBar.add(lineAction);
toolBar.add(rectangleAction);
toolBar.add(circleAction);
toolBar.add(curveAction);
toolBar.add(textAction);
toolBar.addSeparator();
toolBar.add(redAction);
toolBar.add(yellowAction);
toolBar.add(greenAction);
toolBar.add(blueAction);
getContentPane().add(toolBar,BorderLayout.NORTH);
toolBar.setFloatable(false);//工具栏禁止漂浮
getContentPane().add(statusBar,BorderLayout.SOUTH);
fontDlg=new FontDialog(this);
popup=new JPopupMenu("General");
popup.add(lineAction);
popup.add(rectangleAction);
popup.add(circleAction);
popup.add(curveAction);
popup.add(textAction);
popup.addSeparator();
popup.add(redAction);
popup.add(yellowAction);
popup.add(greenAction);
popup.add(blueAction);
files=new JFileChooser(DEFAULT_DIR);
frameTitle=title+":";
setTitle(frameTitle+filename);
if(!DEFAULT_DIR.exists())
if(!DEFAULT_DIR.mkdirs())
JOptionPane.showMessageDialog(this,"建立文件失败!","错误",JOptionPane.ERROR_MESSAGE);
}
private JMenuItem addMenuItem(JMenu menu,Action action){
//重载添加菜单元素的函数使其不具有图象,不具有快键
JMenuItem item=menu.add(action);
item.setIcon(null);
return item;
}
private JMenuItem addMenuItem(JMenu menu,Action action,KeyStroke keys){
//重载添加菜单元素的函数使其不具有图象,具有快键
JMenuItem item=menu.add(action);
item.setIcon(null);
item.setAccelerator(keys);
return item;
}
private JButton addToolBarButton(Action action){
//重载添加工具栏按钮
JButton button=toolBar.add(action);
button.setText(null);
return button;
}
public Color getElementColor(){
return elementColor;
}
public int getElementType(){
return elementType;
}
public Font getFont(){
return font;
}
public void setFont(Font font){
this.font=font;
}
public JPopupMenu getPopup(){
return popup;
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==aboutItem){
JOptionPane.showMessageDialog((Component)e.getSource(),"版本说明:画图软件1.0"
,"关于",JOptionPane.INFORMATION_MESSAGE);
}
else if(e.getSource()==fontItem){
Rectangle bounds=getBounds();
fontDlg.setLocation(bounds.x+bounds.width/3,bounds.y+bounds.height/3);
fontDlg.setVisible(true);
}
else if(e.getSource()==customColorItem){
Color color=JColorChooser.showDialog(this,"颜色选择",elementColor);
if(color!=null){
elementColor=color;
statusBar.setColorPane(color);
}
}
}
public void update(Observable o,Object obj){
changed=true;
}
private File showDialog(String dlgTitle,String ABT,String ABTP,
char ABM,File file){
files.setDialogTitle(dlgTitle);
files.setApproveButtonText(ABT);
files.setApproveButtonToolTipText(ABTP);
files.setApproveButtonMnemonic(ABM);
files.rescanCurrentDirectory();
files.setSelectedFile(file);
int result=files.showDialog(DrawFrame.this,null);
return(result==files.APPROVE_OPTION)?files.getSelectedFile():null;
}
private void saveIt(){
if(!changed) return;
if(modelFile!=null)
saveDraw(modelFile);
else{
File file=showDialog("保存图片","保存","保存图片",'s',
new File(files.getCurrentDirectory(),filename));
if(file==null)
return;
else
if(file.exists())
if(JOptionPane.NO_OPTION==JOptionPane.showConfirmDialog(DrawFrame.this,file.getName()+"已存在,覆盖?"
,"确认保存",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE))
return;
saveDraw(file);
}
}
private void saveDraw(File outFile){
try{
ObjectOutputStream out=new ObjectOutputStream(new
BufferedOutputStream(
new FileOutputStream(outFile)));
out.writeObject(theApp.getModel());
out.flush();
out.close();
}
catch(IOException e){
System.out.println(e);
JOptionPane.showMessageDialog(DrawFrame.this,"错误","保存失败",JOptionPane.ERROR_MESSAGE);
return;
}
if(outFile!=modelFile){
modelFile=outFile;
filename=modelFile.getName();
setTitle(frameTitle+modelFile.getPath());
}
changed=false;
}
public void openDraw(File inFile){
try{
ObjectInputStream in=new ObjectInputStream(new
BufferedInputStream(
new FileInputStream(inFile)));
theApp.insertModel((DrawModel)in.readObject());
in.close();
modelFile=inFile;
filename=modelFile.getName();
setTitle(frameTitle+modelFile.getPath());
}
catch(Exception e){
System.out.println(e);
JOptionPane.showMessageDialog(DrawFrame.this,"错误","打开失败",JOptionPane.ERROR_MESSAGE);
return;
}
}
public void checkForSave(){
if(changed)
if(JOptionPane.YES_OPTION==JOptionPane.showConfirmDialog(DrawFrame.this,"文件已修改,保存?"
,"确认保存",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE))
saveIt();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -