java学习笔记(二)图形用户接口
这个学期主要放在ACM比赛上去了。比赛结束了。不知不觉就15周了,这周就要java考试了。复习一下java吧。java的学习的目的还是让我们学以致用,让我们可以运用java开发一下小项目。而不是单单应付考试。今天复习了一下,图形用户接口,对监听的实现又加深了一些。java的布局控制,gui动画;
对书上代码的实现:
这个程序的功能就是按下button,会改变颜色。后面改变颜色的那个类是渐变的所以效果不明显;
主要是熟悉一下,布局管理和监听的写法。还有paintComponent类的一些使用方法;
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class GUI implements ActionListener { JFrame jf; public static void main(String[] args) { GUI gui=new GUI(); gui.go(); } public void go() { jf=new JFrame(); JButton jb=new JButton("change color"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭 jb.addActionListener(this); MyDrawPanel drawpanel =new MyDrawPanel(); jf.add(BorderLayout.SOUTH,jb); //对组件进行布局管理 jf.add(BorderLayout.CENTER,drawpanel); jf.setSize(500, 500); jf.setVisible(true); } @Override public void actionPerformed(ActionEvent arg0) { //事件监听的一种写法。外部类 jf.repaint(); } } public class MyDrawPanel extends JPanel{ public void paintComponent(Graphics g) //绘图 { Graphics2D g2d=(Graphics2D) g; GradientPaint gradient=new GradientPaint(70,70,Color.blue,150,150,Color.orange);//渐层的颜色 也能够不这么写。效果更明显 g2d.setPaint(gradient); g2d.fillOval(70,70,100,100); } }
实现两个button的监听:
基本的功能是实现两个不同的button的监听,分别有不同的功能
后面的绘图和前面的程序一样;
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class TwoButtons { JFrame jf ; JLabel jl ;//标签 public static void main(String[] args) { TwoButtons gui =new TwoButtons(); gui.go(); } public void go() { jf=new JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton labelbutton=new JButton("change Label"); labelbutton.addActionListener(new ActionListener() {//这里的监听採用的是匿名内部类。也还能够使用内部类 @Override public void actionPerformed(ActionEvent arg0) { jl.setText("ouch!"); } }); JButton colorbutton=new JButton("change circle"); colorbutton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { jf.repaint(); } }); jl=new JLabel("I'am a label"); MyDrawPanel drawpanel=new MyDrawPanel(); jf.add(BorderLayout.SOUTH,colorbutton); jf.add(BorderLayout.CENTER,drawpanel); jf.add(BorderLayout.EAST,labelbutton); jf.add(BorderLayout.WEST,jl); jf.setSize(500, 500); jf.setVisible(true); } }
public class MyDrawPanel extends JPanel{ public void paintComponent(Graphics g) { Graphics2D g2d=(Graphics2D) g; GradientPaint gradient=new GradientPaint(70,70,Color.blue,150,150,Color.orange); g2d.setPaint(gradient); g2d.fillOval(70,70,100,100); } }
大体的界面就是这样;
动画的效果,用到一些线程的初步知识;
import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Simpleanimation { int x=80; int y=80; Mydrawpanel draw; public static void main(String[] args) { Simpleanimation simpleanimation=new Simpleanimation(); simpleanimation.go(); } public void go() { JFrame jf=new JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); draw=new Mydrawpanel(); jf.add(draw); jf.setSize(500, 500); jf.setVisible(true); Thread thread1=new Thread(new Mythread()); thread1.start(); /*for(int i=0;i<300;i++){ x++; y++; draw.repaint(); try { Thread.sleep(50); } catch (Exception e) { } }*/ } class Mythread implements Runnable{//这里就用线程写了一下,初步的知识 @Override public void run() { for(int i=0;i<300;i++){ x++; y++; draw.repaint(); try { Thread.sleep(50); } catch (Exception e) { } } } } class Mydrawpanel extends JPanel { public void paintComponent (Graphics g){ g.setColor(Color.green); g.fillOval(x,y,x,y);//这个x和y改变成其它值就会用不同的效果; } } }
这里这个图像在变化的时候还会留下痕迹;
我们怎么消去这些痕迹呢?
class Mydrawpanel extends JPanel { public void paintComponent (Graphics g){ g.setColor(Color.white); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.green); g.fillOval(x,y,x,y); } }
加入一段代码,在每次画上新的圆圈之前把整个面板用原来的背景底色填满。
这样我们看到的就是动绘图了,把中间的痕迹消去了。
这个的基本效果;
复习的这些都是一些要掌握的基础知识,从基础做起。