📄 main.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package javabrush;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.*; 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)"}, {"关于printbrush(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 ) );//GridLayout 类是一个布局处理器,它以矩形网格形式对容器的组件进行布置。 /*public GridLayout(int rows,该 rows 具有表示任意行数的值零 int cols,该 cols 具有表示任意列数的值零 int hgap,水平间距 int vgap)垂直间距*/ 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("paintbrush"); 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, "程序名称:paintbrush ", "于 paintbrush", 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 ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -