分享
 
 
 

从画图程序开始,走进GUI编程世界

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

从画图程序开始,走进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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有