JAVA中Swing的绘制原理以及如何实现动态图画
⾸先先吐槽⼀下⽤JAVA做界⾯的⾟苦,往⾯板⾥绘制东西要获取他的Graphics,可往往要往⾥⾯画的类是别的类,然后你往⾥⾯画的时候…..坑就出来了。
Swing组件绘制的原理
组件在初始画的时候会调⽤组件本⾝⾃带的paint()和paintComponent(),绘制出他想要的样⼦,如果你单纯想改变他的形状和样⼦时,就可以重写paint()或者paintComponent来达成。不过要注意,在Swing的原始组件中的paint()会调⽤paintComponent(),假如你想在paint()⾥绘制某个图像,paintComponent中绘制另⼀个()并且不想两个图像混在⼀起。看下列实例
以JPanel为例
public class MyPanel extends JPanel{
@Override
protected void paintComponent (Graphics g) {
super.paintComponent(g);
System.out.println("component");
}
@Override
public void paint (Graphics g) {
super.paint(g);
System.out.println("paint");
}
public static void main(String [] ars){
JFrame frame = new JFrame("paintTest");
MyPanel panel = new MyPanel();
frame.add(panel);
frame.setSize(300,300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
class MyButton()
}
运⾏结果是:
component
paint
如果不想调⽤paintComponent(),可以将super.paint()注释掉,这对于Jpanel来说是没有什么问题的,但对于其他组件,例如JButton来说,JButton就不可正常显⽰了。
public class MyButton extends JButton {
public MyButton (String string) {
super(string);
}
@Override
protected void paintComponent (Graphics g) {
super.paintComponent(g);
}
@Override
public void paint (Graphics g) {
// super.paint(g);
}
}
MyButton button = new MyButton("button");
frame.add(button,BorderLayout.EAST);
图⽚插⼊不了,⾃⼰脑补吧。
所以可以⾃⼰根据实际情况来将⾃⼰要写的函数写在paint()或者paintComponent()
repaint()的实质其实是调⽤paint()重新绘制组件
javaswing实现购买timer.schedule(new TimerTask() {
@Override
public void run ( ) {
}
},1000);
这⾥要注意,如果你在调⽤了paint()同⼀个线程⾥调⽤repaint(),他不会重新绘制,因为paint()会查看你是否已经绘制了该组件,如果绘制了就不可重新绘制。所以在这⾥我们新建⼀个线程来执⾏重新绘制。同理,在已经绘制组件后获取组件的Graphics进⾏绘图也不会有任何显⽰。
例如
public static void main(String [] ars){
JFrame frame = new JFrame("paintTest");
MyPanel panel = new MyPanel();
frame.add(panel);
frame.setSize(400,400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
/*paint();这样不会panel不会重新绘制*/
/*或者
Graphics graphics = Graphics();
graphics.drawLine(0,0,50,50) 这样也不会有任何作⽤
*/
}
源码⾥的调⽤时这样的,具体逻辑可在JDK⾥看。
boolean printing = getFlag(IS_PRINTING);
结果是
component
paint
component
paint
动态图画的绘制
下⾯举出⼀个实例来实现动态图画
public class MyPanel extends JPanel{
int x =50;
int y =50;
@Override
public void paint (Graphics g) {
super.paint(g);
g.d);
g.fillOval(x,y,30,30);
}
public static void main(String [] ars){
JFrame frame = new JFrame("paintTest");
MyPanel panel = new MyPanel();
frame.add(panel);
frame.setSize(400,400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run ( ) {
if(panel.x<=300){
panel.x++;
}
}
},0,20);
}
}
Timer的主要⽤处在于创建⼀个新的线程,也可以⽤代替。
注意不要写成这样,这样图画会闪烁不连续,具体为什么我也不太清楚了,可能是Swing画图时的会⾃⼰创建线程,导致抢资源了。
timer.schedule(new TimerTask() {
Graphics graphics = Graphics();
@Override
public void run ( ) {
if(panel.x<=300){
graphics.d);
graphics.fillOval(panel.x,panel.y,30,30);
panel.x++;
}
}
},0,10);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论