从画图程序开始,走进GUI编程世界
Java、画图
//以下是画图的Java版
package boya;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Draw{
private DrawModel model;
private DrawView view;
private static DrawFrame window;
private static Draw theApp;
public static void main(String[] args){
theApp=new Draw();
theApp.init();
}
public void init(){
window=new DrawFrame("画板",this);
Toolkit theKit=window.getToolkit();
Dimension wndsize=theKit.getScreenSize();
window.setBounds(wndsize.width/6,wndsize.height/6,//位置
2*wndsize.width/3,2*wndsize.height/3);//大小
model=new DrawModel();
view=new DrawView(this);
model.addObserver((Observer)view);
model.addObserver((Observer)window);
window.getContentPane().add(view,BorderLayout.CENTER);
window.setVisible(true);
}
public DrawFrame getWindow(){
return window;
}
public DrawModel getModel(){
return model;
}
public DrawView getView(){
return view;
}
class WindowHandler extends WindowAdapter{
public void windowClosing(WindowEvent e){
window.checkForSave();
window.dispose();//关闭窗口
System.exit(0);//关闭程序
}
}
public void insertModel(DrawModel anew){
model=anew;
model.addObserver((Observer)view);
model.addObserver((Observer)window);
view.repaint();
}
}
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,printAction;
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;
}
else if(name.equals(printAction.getValue(NAME))){
}
}
}
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(fileMenu,printAction=new FileAction("打印","打印文件"),KeyStroke
.getKeyStroke('P',Event.CTRL_MASK));
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.add(printAction);
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(),"版本说明:画图软件由博雅制作"
,"关于",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();
}
}
package boya;
import java.io.*;
import java.util.*;
class DrawModel extends Observable implements Serializable{
protected LinkedList elements=new LinkedList();
public void add(Elements element){
elements.add(element);
setChanged();
notifyObservers(element.getBounds());
}
public boolean remove(Elements element){
boolean removed=elements.remove(element);
if(removed){
setChanged();
notifyObservers(element.getBounds());
}
return removed;
}
public Iterator getIterator(){
return elements.listIterator();
}
}
package boya;
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class DrawView extends JComponent implements Observer,ID{
private Draw theApp;
public DrawView(Draw theApp){
this.theApp=theApp;
MouseHandler handler=new MouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
}
class MouseHandler extends MouseInputAdapter{
private Point start,end;
private Elements temp;
private Graphics2D g2D;
private Elements createElement(Point start,Point end){
switch(theApp.getWindow().getElementType()){
case LINE:
return new Elements.Line(start,end,theApp.getWindow().getElementColor());
case RECTANGLE:
return new Elements.Rectangle(start,end,theApp.getWindow().getElementColor());
case CIRCLE:
return new Elements.Circle(start,end,theApp.getWindow().getElementColor());
case CURVE:
return new Elements.Curve(start,end,theApp.getWindow().getElementColor());
}
return null;
}
public void mousePressed(MouseEvent e){
start=e.getPoint();
int modifier=e.getModifiers();
if((modifier&e.BUTTON1_MASK)!=0){
g2D=(Graphics2D)getGraphics();
g2D.setXORMode(getBackground());
g2D.setPaint(theApp.getWindow().getElementColor());
}
}
public void mouseDragged(MouseEvent e){
end=e.getPoint();
int modifier=e.getModifiers();
if((modifier&e.BUTTON1_MASK)!=0&&(theApp.getWindow()
.getElementType()!=TEXT)){
if(temp==null)
temp=createElement(start,end);
else{
temp.draw(g2D);
temp.moving(start,end);
}
temp.draw(g2D);
}
}
public void mouseReleased(MouseEvent e){
int modifier=e.getModifiers();
if(e.isPopupTrigger()){
start=e.getPoint();
theApp.getWindow().getPopup().show((Component)e.getSource(),
start.x,start.y);
start=null;
}
else if((modifier&e.BUTTON1_DOWN_MASK)==0&&(theApp.getWindow()
.getElementType()!=TEXT)){
if(temp!=null){
theApp.getModel().add(temp);
temp=null;
}
if(g2D!=null){
g2D.dispose();
g2D=null;
}
start=end=null;
}
}
public void mouseClicked(MouseEvent e){
int modifier=e.getModifiers();
if((modifier&e.BUTTON1_MASK)!=0&&(theApp.getWindow()
.getElementType()==TEXT)){
start=e.getPoint();
String text=JOptionPane.showInputDialog(
(Component)e.getSource(),"输入文字"
,"文字",JOptionPane.PLAIN_MESSAGE);
if(text!=null){
g2D=(Graphics2D)getGraphics();
Font font=theApp.getWindow().getFont();
temp=new Elements.Text(font,text,start,
theApp.getWindow().getElementColor(),
font.getStringBounds(text,g2D.getFontRenderContext()).getBounds());
temp.draw(g2D);
if(temp!=null)
theApp.getModel().add(temp);
temp=null;
g2D.dispose();
g2D=null;
start=null;
}
}
}
}
public void update(Observable o,Object rectangle){
if(rectangle==null)
repaint();
else repaint((Rectangle)rectangle);
}
public void paint(Graphics g){
Graphics2D g2D=(Graphics2D)g;
Iterator elements=theApp.getModel().getIterator();
Elements element;
while(elements.hasNext()){
element=(Elements)elements.next();
element.draw(g2D);
}
}
}
package boya;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
abstract class Elements implements Serializable{
protected Color color;
public Elements(Color color){
this.color=color;
}
public Color getColor(){
return color;
}
public abstract java.awt.Rectangle getBounds();
public abstract void moving(Point start,Point end);
public abstract void draw(Graphics2D g2D);
public static class Line extends Elements{
private Line2D.Double line;
public Line(Point start,Point end,Color color){
super(color);
line=new Line2D.Double(start,end);
}
public java.awt.Rectangle getBounds(){
return line.getBounds();
}
public void moving(Point start,Point end){
line.x2=end.x;
line.y2=end.y;
}
public void draw(Graphics2D g2D){
g2D.setPaint(color);
g2D.draw(line);
}
private void writeObject(ObjectOutputStream out)
throws IOException{
out.writeDouble(line.x2);
out.writeDouble(line.y2);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException,ClassNotFoundException{
double x2=in.readDouble();
double y2=in.readDouble();
line=new Line2D.Double(0,0,x2,y2);
}
}
public static class Rectangle extends Elements{
private Rectangle2D.Double rectangle;
public Rectangle(Point start,Point end,Color color){
super(color);
rectangle=new Rectangle2D.Double(
Math.min(start.x,end.x),Math.min(start.y,end.y),
Math.abs(start.x-end.x),Math.abs(start.y-end.y));
}
public java.awt.Rectangle getBounds(){
return rectangle.getBounds();
}
public void moving(Point start,Point end){
rectangle.x=Math.min(start.x,end.x);
rectangle.y=Math.min(start.y,end.y);
rectangle.width=Math.abs(start.x-end.x);
rectangle.height=Math.abs(start.y-end.y);
}
public void draw(Graphics2D g2D){
g2D.setPaint(color);
g2D.draw(rectangle);
}
private void writeObject(ObjectOutputStream out)
throws IOException{
out.writeDouble(rectangle.width);
out.writeDouble(rectangle.height);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException,ClassNotFoundException{
double width=in.readDouble();
double height=in.readDouble();
rectangle=new Rectangle2D.Double(0,0,width,height);
}
}
public static class Circle extends Elements{
private Ellipse2D.Double circle;
public Circle(Point center,Point circum,Color color){
super(color);
double radius=center.distance(circum);
circle=new Ellipse2D.Double(center.x-radius,center.y-radius,2*radius,2*radius);
}
public java.awt.Rectangle getBounds(){
return circle.getBounds();
}
public void moving(Point center,Point circum){
double radius=center.distance(circum);
circle.x=center.x-(int)radius;
circle.y=center.y-(int)radius;
circle.width=circle.height=2*radius;
}
public void draw(Graphics2D g2D){
g2D.setPaint(color);
g2D.draw(circle);
}
private void writeObject(ObjectOutputStream out)
throws IOException{
out.writeDouble(circle.width);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException,ClassNotFoundException{
double width=in.readDouble();
circle=new Ellipse2D.Double(0,0,width,width);
}
}
public static class Curve extends Elements{
private GeneralPath curve;
public Curve(Point start,Point next,Color color){
super(color);
curve=new GeneralPath();
curve.moveTo(start.x,start.y);
curve.lineTo(next.x,next.y);
}
public java.awt.Rectangle getBounds(){
return curve.getBounds();
}
public void moving(Point start,Point next){
curve.lineTo(next.x,next.y);
}
public void draw(Graphics2D g2D){
g2D.setPaint(color);
g2D.draw(curve);
}
private void writeObject(ObjectOutputStream out)
throws IOException{
PathIterator iterator=curve.getPathIterator(new AffineTransform());
Vector coords=new Vector();
int max=6;
float[] temp=new float[max];
int result=iterator.currentSegment(temp);
if(!(result==iterator.SEG_MOVETO)){
System.out.println("No Starting moveto");
return;
}
iterator.next();
while(!iterator.isDone()){
result=iterator.currentSegment(temp);
if(!(result==iterator.SEG_LINETO)){
System.out.println("Invalid segment type");
return;
}
coords.add(new Float(temp[0]));
coords.add(new Float(temp[1]));
iterator.next();
}
out.writeObject(coords);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException,ClassNotFoundException{
Vector coords=(Vector)in.readObject();
curve=new GeneralPath();
curve.moveTo(0,0);
float x,y;
for(int i=0;i<coords.size();i+=2){
x=((Float)coords.get(i)).floatValue();
y=((Float)coords.get(i+1)).floatValue();
curve.lineTo(x,y);
}
}
}
public static class Text extends Elements{
private Font font;
private String text;
private Point pos;
private java.awt.Rectangle bounds=null;
public Text(Font font,String text,Point pos,Color color,java.awt.Rectangle bounds){
super(color);
this.font=font;
this.text=text;
this.pos=pos;
this.bounds=bounds;
this.bounds.setLocation(pos.x,pos.y-(int)bounds.getHeight());
}
public java.awt.Rectangle getBounds(){
return bounds;
}
public void moving(Point start,Point end){
}
public void draw(Graphics2D g2D){
g2D.setPaint(color);
Font oldFont=g2D.getFont();
g2D.setFont(font);
g2D.drawString(text,pos.x,pos.y);
g2D.setFont(oldFont);
}
}
}
package boya;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
class FontDialog extends JDialog implements ID,ActionListener
,ListSelectionListener{
private DrawFrame window;
private Font font;
private int style;
private int size;
private JButton ok,cancel;
private JList fontList;
private JLabel fontDisplay;
private JComboBox chooseSize;
public FontDialog(DrawFrame window){
super(window,"字体选择",true);
this.window=window;
font=window.getFont();
style=font.getStyle();
size=font.getSize();
JPanel buttonPane=new JPanel();
buttonPane.add(ok=createButton("确认"));
buttonPane.add(cancel=createButton("取消"));
getContentPane().add(buttonPane,BorderLayout.SOUTH);
JPanel dataPane=new JPanel();
dataPane.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.black),
BorderFactory.createEmptyBorder(5,5,5,5)));
GridBagLayout gbLayout=new GridBagLayout();
dataPane.setLayout(gbLayout);
GridBagConstraints constraints=new GridBagConstraints();
JLabel label=new JLabel("选择字体");
constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.gridwidth=GridBagConstraints.REMAINDER;
gbLayout.setConstraints(label,constraints);
dataPane.add(label);
GraphicsEnvironment e=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fonts=e.getAvailableFontFamilyNames();
fontList=new JList(fonts);
fontList.setValueIsAdjusting(true);
fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fontList.setSelectedValue(font.getFamily(),true);
fontList.addListSelectionListener(this);
JScrollPane chooseFont=new JScrollPane(fontList);
chooseFont.setMinimumSize(new Dimension(300,100));
JPanel display=new JPanel();
fontDisplay=new JLabel("字体样例:x X y Y z Z");
fontDisplay.setPreferredSize(new Dimension(300,100));
display.add(fontDisplay);
JSplitPane splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,chooseFont,display);
gbLayout.setConstraints(splitPane,constraints);
dataPane.add(splitPane);
JPanel sizePane=new JPanel();
label=new JLabel("选择字体大小");
sizePane.add(label);
String[] sizeList={"8","10","12","14","16","18","20","22","24"};
chooseSize=new JComboBox(sizeList);
chooseSize.setSelectedItem(Integer.toString(size));
chooseSize.addActionListener(this);
sizePane.add(chooseSize);
gbLayout.setConstraints(sizePane,constraints);
dataPane.add(sizePane);
JRadioButton bold=new JRadioButton("加粗",(style&Font.BOLD)>0);
JRadioButton italic=new JRadioButton("斜体",(style&Font.ITALIC)>0);
bold.addItemListener(new StyleListener(Font.BOLD));
italic.addItemListener(new StyleListener(Font.ITALIC));
JPanel stylePane=new JPanel();
stylePane.add(bold);
stylePane.add(italic);
gbLayout.setConstraints(stylePane,constraints);
dataPane.add(stylePane);
getContentPane().add(dataPane,BorderLayout.CENTER);
pack();
setVisible(false);
}
JButton createButton(String label){
JButton button=new JButton(label);
button.setPreferredSize(new Dimension(80,20));
button.addActionListener(this);
return button;
}
public void actionPerformed(ActionEvent e){
Object source=e.getSource();
if(source==ok){
window.setFont(font);
setVisible(false);
}
else if(source==cancel)
setVisible(false);
else if(source==chooseSize){
size=Integer.parseInt((String)chooseSize.getSelectedItem());
font=font.deriveFont((float)size);
fontDisplay.setFont(font);
fontDisplay.repaint();
}
}
public void valueChanged(ListSelectionEvent e){
if(!e.getValueIsAdjusting()){
font=new Font((String)fontList.getSelectedValue(),style,size);
fontDisplay.setFont(font);
fontDisplay.repaint();
}
}
class StyleListener implements ItemListener{
private int astyle;
public StyleListener(int style){
this.astyle=style;
}
public void itemStateChanged(ItemEvent e){
if(e.getStateChange()==ItemEvent.SELECTED)
style|=astyle;
else style&=~astyle;
font=font.deriveFont(style);
fontDisplay.setFont(font);
fontDisplay.repaint();
}
}
}
package boya;
import java.awt.*;
import java.io.File;
public interface ID{
int LINE=101;
int RECTANGLE=102;
int CIRCLE=103;
int CURVE=104;
int TEXT=105;
int DEFAULT_ELEMENT_TYPE=LINE;
Color DEFAULT_ELEMENT_COLOR=Color.red;
Font DEFAULT_FONT=new Font("宋体",Font.PLAIN,20);
File DEFAULT_DIR=new File("c:/My Draw");
String DEFAULT_FILENAME="Untitled.ice";
}
package boya;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class StatusBar extends JPanel implements ID{
private StatusPane colorPane=new StatusPane("红色");
private StatusPane typePane=new StatusPane("直线");
class StatusPane extends JLabel{
private Font paneFont=new Font("宋体",Font.PLAIN,12);
public StatusPane(String text){
setForeground(Color.black);
setFont(paneFont);
setHorizontalAlignment(CENTER);
setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));;
setPreferredSize(new Dimension(70,18));
setText(text);
}
}
public StatusBar(){
setLayout(new FlowLayout(FlowLayout.RIGHT,10,3));
setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
setColorPane(DEFAULT_ELEMENT_COLOR);
setTypePane(DEFAULT_ELEMENT_TYPE);
add(colorPane);
add(typePane);
}
public void setColorPane(Color color){
String text;
if(color.equals(Color.red))
text="红色";
else if(color.equals(Color.yellow))
text="黄色";
else if(color.equals(Color.green))
text="绿色";
else if(color.equals(Color.blue))
text="蓝色";
else text="未定义";
colorPane.setText(text);
}
public void setTypePane(int element){
String text;
switch(element){
case LINE:
text="直线";
break;
case RECTANGLE:
text="矩形";
break;
case CIRCLE:
text="圆";
break;
case CURVE:
text="曲线";
break;
case TEXT:
text="文字";
break;
default:
text="错误";
break;
}
typePane.setText(text);
}
}
最后还可以将生成的代码放置到JAR包中,这样就可以在安装JVM的环境下,使
此JAR包作为可执行文件了。
包的结构如下:
--Draw
----boya
----META-INF
----res
其分别为包、配置文件、资源
在META-INF中建立文件MANIFEST.MF写入:
Manifest-Version: 1.0
Main-Class: boya.Draw
这样这个包就完成了
Main-Class: boya.Draw