界面
程序登录界面
想做一个有图像处理功能的画板,首先需要一个简易的登陆界面。
如图是简易的登录界面,输入正确的账号密码即可进入画图板界面。
JFrame weixin=new JFrame();
weixin.setTitle("画图板");
weixin.setSize(300, 400);
weixin.setLocationRelativeTo(null);
FlowLayout fl=new FlowLayout();
weixin.setLayout(fl);
weixin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon image =new ImageIcon("C:\\Users\\10977\\Desktop\\timg1.jpg");
JLabel ax=new JLabel(image);
JLabel ay=new JLabel("账号");
JTextField name=new JTextField();
JLabel az=new JLabel("密码");
JPasswordField pwf=new JPasswordField();
JButton aw=new JButton("登录");
Dimension dl=new Dimension(220,30);
name.setPreferredSize(dl);
pwf.setPreferredSize(dl);
weixin.add(ax);
weixin.add(ay);
weixin.add(name);
weixin.add(az);
weixin.add(pwf);
weixin.add(aw);
weixin.setVisible(true);
listener lk=new listener();
lk.zh=name;
lk.mm=pwf;
lk.k=k;
aw.addActionListener(lk);
lk.weixin=weixin;
如图是窗体界面,具体说明我在上一篇文章有讲过,这里就不详细介绍了。
唯一注意的一点是关于登录成功弹出新界面的交互。我们需要用JFframe.DISPOSE_ON_CLOSE,当登陆失败时,我们利用窗口提醒用户还有几次登陆机会,否则退出登陆界面
这里我们对弹出窗体的关闭相应用DISPOSE,否则将关闭整个程序。
如上是登录代码的运行过程。
画图板界面
当登陆成功后我们就进入画图板界面
如下是登陆界面跳转至画图板界面的代码。
if(zh1.equals("123")&&mm1.equals("567")){
System.out.println("登陆成功");
weixin.dispose();
DrawFrame df=new DrawFrame();
df.ht();//登录画图板界面
可以看到有比较分明的布局,这次我们用的布局器不同于上一次,这次使用的是边框布局器。边框布局器分为南北中东西四个部分。当窗体不添加东西南北部时,其他统一视为中部。
BorderLayout fl=new BorderLayout();//边框布局器
JPanel funj=new JPanel(); //面板
JPanel paintj=new JPanel();
paintj.setBackground(Color.WHITE);
dframe.setLayout(fl);
JPanel是一种容器,可以装纳所有组件,同样的,窗体也是容器,并且是顶级容器。dframe.add(funj,BorderLayout.NORTH); dframe.add(paintj,BorderLayout.CENTER);
如上是将面板加入窗体中。我们可以用setpreferredsize调整面板大小。
可以看到窗体顶部有几个选项。这种由多个选项组成的栏目称为菜单栏。
filechooser fc=new filechooser();
JMenuBar jmr=new JMenuBar();
JMenu jm1=new JMenu("壁纸");
JMenu jm2=new JMenu("分形");
JMenu jm3=new JMenu("还原");
JMenu jm4=new JMenu("图片美颜");
jmr.add(jm1);
jmr.add(jm2);
jmr.add(jm3);
jmr.add(jm4);
JMenuItem jmz=new JMenuItem("导入");
JMenuItem rongz=new JMenuItem("熔铸滤镜");
JMenuItem manhua=new JMenuItem("漫画滤镜");
jm4.add(jmz);
jmz.addActionListener(fc);
JMenuItem jmx=new JMenuItem("原图");
jm4.add(jmx);
JMenuItem jmw=new JMenuItem("灰白");
jm4.add(jmw);
jmw.addActionListener(fc);
jm4.add(rongz);
jm4.add(manhua);
manhua.addActionListener(fc);
rongz.addActionListener(fc);
jmx.addActionListener(fc);
JMenuItem jms=new JMenuItem("白板");
JMenuItem jmp=new JMenuItem("蓝色");
JMenuItem jml=new JMenuItem("红色");
jm3.add(jms);
jm3.add(jmp);
jm3.add(jml);
JMenuItem jmk=new JMenuItem("枫叶");
JMenuItem jmq=new JMenuItem("树叶");
jm2.add(jmk);
jm2.add(jmq);
dframe.setJMenuBar(jmr);
JMenuItem jmi=new JMenuItem("原图");
jm1.add(jmi);
JMenuItem jmc=new JMenuItem("灰白");
jm1.add(jmc);
JMenuItem jmd=new JMenuItem("模糊");
jm1.add(jmd);
show sh=new show();
dframe.setJMenuBar(jmr);
jmi.addActionListener(sh);
jms.addActionListener(ln);
jmp.addActionListener(ln);
jml.addActionListener(ln);
jmc.addActionListener(sh);
jmd.addActionListener(sh);
jmk.addActionListener(ln);
jmq.addActionListener(ln);
菜单栏的所有代码,单个栏目称为菜单,菜单中个体内容称为菜单项。
值得注意的是我们在使用边框布局器后,对画布的引用不能再是整个窗体,而是布局中的某个部分,如中部。不然画出直线不能与鼠标绘制的重合。菜单项同样使用按钮监听器进行响应。
绘图
绘画图形
可以看到画图板中最基本的图形有直线,矩形还有椭圆。
关于绘制方法
Graphics g;
g.drawLine(x1,y1,x2,y2)//直线
g.drawRect(x,y,m,n)//m,n是长和宽
g.drawOval(x,y,m,n)//m,n是半径
如下是具体代码
if(s.equals("直线")){
g.drawLine(x1, y1, x2, y2);
double dx=(double)(x2-x1);
double dy=(double)(y2-y1);
double l=Math.sqrt(dx*dx+dy*dy);
double sin=dy/l;
double cos=dx/l;
int k1=js.getValue();
for(int a=1;a<k1;a++){
int m=(int)(sin*a);
int n=(int)(cos*a);
if(m>=1||n>=1){
g.drawLine(x1+m, y1+n, x2+m, y2+n);
}
else{
k1++;
}
}
x3=x2;
y3=y2;
x0=x1;
y0=y1;
}
else if(s.equals("矩形")){
g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
int k1=js.getValue();
for(int a=1;a<k1;a++){
g.drawRect(x1+a, y1+a, Math.abs(x2-x1), Math.abs(y2-y1));
}
}
else if(s.equals("椭圆")){
g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
int k1=js.getValue();
for(int a=1;a<k1;a++){
g.drawOval(x1+a, y1+a, Math.abs(x2-x1), Math.abs(y2-y1));
}
}
线条粗细
由于老版JAVA中没有调节线条粗细的方法,我就自定义了一种算法调整线条粗细
线条宽度可以理解为画多个平行曲线来增加视觉宽度,宽度越大,平行曲线越多越多
k1是线条粗度,也就是循环次数,然后我们通过循环不断画出平行直线。
这里我使用了一种滤镜,叫动漫滤镜。以下是算法运行的细节。
if(file!=null){
for(int x=0;x<dat.length;x++){
for(int y=0;y<dat[x].length;y++){
Color co=new Color(dat[x][y]);
if("灰白".equals(s)){
int a=co.getRed();
co=new Color(a,a,a);}
if("熔铸滤镜".equals(s)){
int gr=co.getRed();
int gg=co.getGreen();
int gb=co.getBlue();
int ngr=(int)(128*gr/(gg+gb+1));
int ngg=(int)(128*gg/(gr+gb+1));
int ngb=(int)(128*gb/(gr+gg+1));
co=new Color(Math.min(ngr,255),Math.min(ngg,255),Math.min(ngb,255));
}
if("漫画滤镜".equals(s)){
int gr=co.getRed();
int gg=co.getGreen();
int gb=co.getBlue();
int ngr=(int)(Math.abs(2*gg+gr-gb)*gr/256);
int ngg=(int)(Math.abs(2*gb+gr-gg)*gr/256);
int ngb=(int)(Math.abs(2*gb+gr-gg)*gg/256);
co=new Color(Math.min(ngr,255),Math.min(ngg,255),Math.min(ngb,255));
}
线条颜色
在画图时我们想要转换画笔颜色,可以增加按钮,让按钮字符为空,给按钮背景设置成对应的颜色,再添加按钮监听器,即可达到转换颜色的目的
if("".equals(e.getActionCommand())){
JButton x=(JButton)e.getSource();
g.setColor(x.getBackground());
以上就是关于画图板的大致内容了,其他额外的效果也可以自己添加,我就不多提了。