📄 paintbrush.txt
字号:
package javaapplication4
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) );// keyStroke - 快捷键组合,它将不导航菜单层次结构地调用 JMenuItem 的 actionlistener
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, "作者:christy ", " 程序名称: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 ) );
g2d.draw( new Rectangle2D.Double( -1, -1, x+3, y+3 ) );
}
}
public class SetPanel extends JPanel implements ItemListener, ChangeListener, ActionListener{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -