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

📄 painter.java

📁 JAVA编写的画图程序
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.font.*;

public class Painter extends JFrame implements ActionListener {
	private	Container c = getContentPane();
	private	String menuBar[]={"檔案(F)","編輯(E)","檢視(V)","說明(H)"};
	private	String menuItem[][]={
		{"開新檔案(N)|78","開啟舊檔(O)|79","儲存檔案(S)|83","另存新檔(A)","結束(X)|88"},
		{"復原(U)|90","重複(R)|89","剪下(T)|87","複製(C)|68","貼上(P)|85"},
		{"工具箱(T)|84","色塊(C)|76","狀態列(S)","屬性欄(M)"},
		{"關於小畫家(A)"}
	};
	private	JMenuItem jMenuItem[][]=new JMenuItem[4][5];
	private	JMenu jMenu[];
	private	JCheckBoxMenuItem jCheckBoxMenuItem[] = new JCheckBoxMenuItem[4];
	private	String ButtonName[]={"直線","矩型","橢圓","圓角矩型","貝氏曲線","扇型","多邊型","鉛筆","橡皮擦","文字","選取"};
	private JToggleButton jToggleButton[];
    private ButtonGroup buttonGroup;
	private	JPanel jPanel[]=new JPanel[5];//0內層,1繪圖區,2工具箱,3色塊,4屬性欄
	private	JLabel jLabel[]=new JLabel[1];//狀態列
	private	String toolname[]={"img/tool1.gif","img/tool2.gif","img/tool3.gif","img/tool4.gif","img/tool5.gif","img/tool8.gif","img/tool9.gif","img/tool7.gif","img/tool6.gif","img/tool10.gif","img/tool11.gif"};
	private	Icon tool[]=new ImageIcon[11];
	private	int i,j,show_x,show_y,drawMethod=7,draw_panel_width=700,draw_panel_height=500;
	private Paint color_border,color_inside;
	private SetPanel setPanel;
	private DrawPanel drawPanel;
	private UnderDrawPanel underDrawPanel;
	private ColorPanel colorPanel;
	private Stroke stroke;
	private Shape shape;
	private String isFilled;
	
	public Painter(){
		//設定JMenuBar,並產生JMenuItem、並設置快捷鍵
		JMenuBar bar = new JMenuBar();
		jMenu=new JMenu[menuBar.length];
		for(i=0;i<menuBar.length;i++){
			jMenu[i] = new JMenu(menuBar[i]);
			jMenu[i].setMnemonic(menuBar[i].split("\\(")[1].charAt(0));
			bar.add(jMenu[i]);
		}
		
		for(i=0;i<menuItem.length;i++){
			for(j=0;j<menuItem[i].length;j++){
				if(i==0 && j==4 || i==1 && j==2) jMenu[i].addSeparator();
				if(i!=2){
					jMenuItem[i][j] = new JMenuItem(menuItem[i][j].split("\\|")[0]);
					if(menuItem[i][j].split("\\|").length!=1)
						jMenuItem[i][j].setAccelerator(KeyStroke.getKeyStroke(Integer.parseInt(menuItem[i][j].split("\\|")[1]), ActionEvent.CTRL_MASK) );
					jMenuItem[i][j].addActionListener(this);
					jMenuItem[i][j].setMnemonic(menuItem[i][j].split("\\(")[1].charAt(0));

					jMenu[i].add(jMenuItem[i][j]);
				}
				else{
					jCheckBoxMenuItem[j] = new JCheckBoxMenuItem(menuItem[i][j].split("\\|")[0]);
					if(menuItem[i][j].split("\\|").length!=1)
						jCheckBoxMenuItem[j].setAccelerator(KeyStroke.getKeyStroke(Integer.parseInt(menuItem[i][j].split("\\|")[1]), ActionEvent.CTRL_MASK) );
					jCheckBoxMenuItem[j].addActionListener(this);
					jCheckBoxMenuItem[j].setMnemonic(menuItem[i][j].split("\\(")[1].charAt(0));
					jCheckBoxMenuItem[j].setSelected( true );
					jMenu[i].add(jCheckBoxMenuItem[j]);
				}
			}
		}
		this.setJMenuBar( bar );
		c.setLayout( new BorderLayout() );
		for(i=0;i<5;i++)
			jPanel[i]=new JPanel();
			
		jLabel[0]=new JLabel(" 狀態列");
		
		buttonGroup = new ButtonGroup();
		JToolBar jToolBar=new JToolBar("工具箱",JToolBar.VERTICAL);
		jToggleButton=new JToggleButton[ButtonName.length];
		for(i=0;i<ButtonName.length;i++){
			tool[i] = new ImageIcon(toolname[i]);
			jToggleButton[i] = new JToggleButton(tool[i]);
			jToggleButton[i].addActionListener( this );
			jToggleButton[i].setFocusable( false );
			buttonGroup.add(jToggleButton[i]);
		}
		jToolBar.add(jToggleButton[7]);
		jToolBar.add(jToggleButton[8]);
		jToolBar.add(jToggleButton[0]);
		jToolBar.add(jToggleButton[4]);
		jToolBar.add(jToggleButton[1]);
		jToolBar.add(jToggleButton[3]);
		jToolBar.add(jToggleButton[2]);
		jToolBar.add(jToggleButton[5]);
		jToolBar.add(jToggleButton[6]);
		jToolBar.add(jToggleButton[9]);
		jToolBar.add(jToggleButton[10]);
		jToggleButton[7].setSelected(true);
		jToolBar.setLayout( new GridLayout( 6, 2, 2, 2 ) );
		jPanel[2].add(jToolBar);
		
		jToolBar.setFloatable(false);//無法移動
		
		colorPanel=new ColorPanel();
		jPanel[3].setLayout(new FlowLayout(FlowLayout.LEFT));
		jPanel[3].add(colorPanel);
		
		drawPanel=new DrawPanel();
		underDrawPanel=new UnderDrawPanel();
		underDrawPanel.setLayout(null);
		underDrawPanel.add(drawPanel);
		drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
		
		setPanel=new SetPanel();
		jPanel[4].add(setPanel);
		
		jPanel[0].setLayout( new BorderLayout() );
		jPanel[0].add(underDrawPanel,BorderLayout.CENTER);
		jPanel[0].add(jPanel[2],BorderLayout.WEST);
		jPanel[0].add(jPanel[3],BorderLayout.SOUTH);
		jPanel[0].add(jPanel[4],BorderLayout.EAST);
		
		jLabel[0].setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		underDrawPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		underDrawPanel.setBackground(new Color(128,128,128));
		jPanel[3].setBorder(BorderFactory.createMatteBorder(1,0,0,0,new Color(172,168,153)));
		
		c.add(jPanel[0],BorderLayout.CENTER);
		c.add(jLabel[0],BorderLayout.SOUTH);
		
		setSize(draw_panel_width,draw_panel_height);
		setTitle("小畫家");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		show();
	}
	public void save(){
		FileDialog fileDialog = new FileDialog( new Frame() , "請指定一個檔名", FileDialog.SAVE );
		fileDialog.show();
		if(fileDialog.getFile()==null) return;
		drawPanel.filename = fileDialog.getDirectory()+fileDialog.getFile();
	}
	
	public void actionPerformed( ActionEvent e ){
		for(i=0;i<ButtonName.length;i++){
			if(e.getSource()==jToggleButton[i]){
				drawMethod=i;
				if(drawMethod==5)
					setPanel.pie_add_ctrl();
				else
					setPanel.pie_remove_ctrl();
				if(drawMethod==7 || drawMethod==8)
					setPanel.pencil_add_ctrl();
				else
					setPanel.pencil_remove_ctrl();
				drawPanel.clear();
				drawPanel.repaint();
   				jMenuItem[1][2].setEnabled(false);
   				jMenuItem[1][3].setEnabled(false);
			}
		}
		
		if(e.getSource()==jMenuItem[1][0]){
			drawPanel.undo();
		}
		else if(e.getSource()==jMenuItem[1][1]){
			drawPanel.redo();
		}
		else if(e.getSource()==jMenuItem[1][2]){
			drawPanel.cut();
		}
		else if(e.getSource()==jMenuItem[1][3]){
			drawPanel.copy();
		}
		else if(e.getSource()==jMenuItem[1][4]){
			drawPanel.paste();
		}
		else if(e.getSource()==jMenuItem[0][0]){//開新檔案
			underDrawPanel.remove(drawPanel);
			drawPanel=null;
			drawPanel=new DrawPanel();
			underDrawPanel.add(drawPanel);
			drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
			underDrawPanel.ctrl_area.setLocation(draw_panel_width+3,draw_panel_height+3);
			underDrawPanel.ctrl_area2.setLocation(draw_panel_width+3,draw_panel_height/2+3);
			underDrawPanel.ctrl_area3.setLocation(draw_panel_width/2+3,draw_panel_height+3);
			repaint();
		}
		else if(e.getSource()==jMenuItem[0][1]){//開啟舊檔
			FileDialog fileDialog = new FileDialog( new Frame() , "選擇一個圖檔", FileDialog.LOAD );
			fileDialog.show();
			if(fileDialog.getFile()==null) return;
			
			underDrawPanel.removeAll();
			drawPanel=null;
			drawPanel=new DrawPanel();
			underDrawPanel.add(drawPanel);
			drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
			
			drawPanel.openfile(fileDialog.getDirectory()+fileDialog.getFile());
		}
		else if(e.getSource()==jMenuItem[0][2]){//儲存檔案
			if(drawPanel.filename==null){
				save();
			}
			else{
				try{
					int dotpos = drawPanel.filename.lastIndexOf('.');
					ImageIO.write(drawPanel.bufImg, drawPanel.filename.substring(dotpos + 1), new File(drawPanel.filename));
				}
				catch(IOException even) {
					JOptionPane.showMessageDialog(null, even.toString(),"無法儲存圖檔", JOptionPane.ERROR_MESSAGE);
				}
			}
		}
		else if(e.getSource()==jMenuItem[0][3]){//另存新檔
			save();
			try{
				int dotpos = drawPanel.filename.lastIndexOf('.');
				ImageIO.write(drawPanel.bufImg, drawPanel.filename.substring(dotpos + 1), new File(drawPanel.filename));
			}
			catch(IOException even) {
				JOptionPane.showMessageDialog(null, even.toString(),"無法儲存圖檔", JOptionPane.ERROR_MESSAGE);
			}
		}
		else if(e.getSource()==jMenuItem[0][4]){//離開
			System.exit(0);
		}
		else if(e.getSource()==jMenuItem[3][0]){//關於
			JOptionPane.showMessageDialog(null, "程式名稱:小畫家 (2004/6/2)\n作者:朱偉綸\n系級:淡江大學資訊工程1-C\n信箱:weiluen@pie.com.tw\n\n版本特點:嗡\n", "關於 小畫家", 1, new ImageIcon("img/paint.gif"));
		}
		for(i=0;i<2;i++){
			if(jCheckBoxMenuItem[i].isSelected())
				jPanel[i+2].setVisible( true );
           	else
           		jPanel[i+2].setVisible( false );
       	}
       	if(jCheckBoxMenuItem[3].isSelected()){
       		setPanel.setVisible( true );
       		jPanel[4].setVisible( true );
       	}
       	else{
       		setPanel.setVisible( false );
       		jPanel[4].setVisible( false );
       	}
		if(jCheckBoxMenuItem[2].isSelected())
			jLabel[0].setVisible( true );
       	else
       		jLabel[0].setVisible( false );
	}
	
	public class UnderDrawPanel extends JPanel implements MouseListener, MouseMotionListener{
		public int x,y;
		float data[]={2};
		public JPanel ctrl_area=new JPanel(),ctrl_area2=new JPanel(),ctrl_area3=new JPanel();
		
		public UnderDrawPanel(){
			this.setLayout(null);
			this.add(ctrl_area);
			this.add(ctrl_area2);
			this.add(ctrl_area3);
			
			ctrl_area.setBounds(new Rectangle(draw_panel_width+3, draw_panel_height+3, 5, 5));
			ctrl_area.setBackground(new Color(0,0,0));
			ctrl_area2.setBounds(new Rectangle(draw_panel_width+3, draw_panel_height/2, 5, 5));
			ctrl_area2.setBackground(new Color(0,0,0));
			ctrl_area3.setBounds(new Rectangle(draw_panel_width/2, draw_panel_height+3, 5, 5));
			ctrl_area3.setBackground(new Color(0,0,0));
    		ctrl_area.addMouseListener(this);
    		ctrl_area.addMouseMotionListener(this);
    		ctrl_area2.addMouseListener(this);
    		ctrl_area2.addMouseMotionListener(this);
    		ctrl_area3.addMouseListener(this);
    		ctrl_area3.addMouseMotionListener(this);
		}
		
		public void mouseClicked(MouseEvent e){}
		public void mousePressed(MouseEvent e){}
		public void mouseReleased(MouseEvent e){
			draw_panel_width=x;
			draw_panel_height=y;
			
			ctrl_area.setLocation(draw_panel_width+3,draw_panel_height+3);
			ctrl_area2.setLocation(draw_panel_width+3,draw_panel_height/2+3);
			ctrl_area3.setLocation(draw_panel_width/2+3,draw_panel_height+3);
			drawPanel.setSize(x,y);
			drawPanel.resize();
			repaint();
		}
		
		public void mouseEntered(MouseEvent e){}
		public void mouseExited(MouseEvent e){}
		
    	public void mouseDragged(MouseEvent e){
    		if(e.getSource()==ctrl_area2){
    			x = e.getX()+draw_panel_width;
    			y = draw_panel_height;
    		}
    		else if(e.getSource()==ctrl_area3){
    			x = draw_panel_width;
    			y = e.getY()+draw_panel_height;
    		}
    		else{
    			x = e.getX()+draw_panel_width;
    			y = e.getY()+draw_panel_height;
    		}
    		repaint();
    		jLabel[0].setText(x+","+y);
    	}
    	public void mouseMoved(MouseEvent e) {}
    	
		public void paint(Graphics g) {
			Graphics2D g2d = (Graphics2D) g;
			super.paint(g2d);
			
			g2d.setPaint( new Color(128,128,128) );
			g2d.setStroke( new BasicStroke( 1,  BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 10, data, 0 ) );
			g2d.draw( new Rectangle2D.Double( -1, -1, x+3, y+3 ) );
		}
	}
	
	public class SetPanel extends JPanel implements ItemListener, ChangeListener, ActionListener{
		private	JPanel jPanel_set1=new JPanel();
		private	JPanel jPanel_set2=new JPanel();
		private	JPanel temp0=new JPanel(new GridLayout(4,1)), temp1=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp2=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp3=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp4=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp5=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp6=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp7=new JPanel(new FlowLayout(FlowLayout.LEFT)), temp8=new JPanel(new GridLayout(3,1));

		public JCheckBox jCheckBox = new JCheckBox();
		private BufferedImage bufImg = new BufferedImage(50 ,50,BufferedImage.TYPE_3BYTE_BGR);
		private JLabel jlbImg=new JLabel();
		float data[]={20};

⌨️ 快捷键说明

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