Swing渲染基本原理
1.事件:事件派发线程(EDT);
2.绘制:
1)异步重绘:Component.repaint() 、Component.repaint(int x, int y, int width, int height)
2)同步绘制:JComponent.paintImmediately(int x, int y, int width, int height)和JComponent.paintlmmediately(Rectangle r) 、Component.paint(Graphics g)
3.渲染:
JComponent.paintComponent(Graphics g) 、Component.paint(Graphics g) 、Jcomponent.setOpaque(Boolean b)
1)paintComponent()
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class OvalComponent extends JComponent {
public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Oval");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 180);
frame.add(new OvalComponent());
frame.setVisible(true);
}
});
}
}
2)paint()
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class TranslucentButton extends JButton {
BufferedImage buttonImage;
public TranslucentButton(String label) {
super(label);
setOpaque(false);
}
public void paint(Graphics g) {
if(buttonImage == null ||
buttonImage.getWidth() != getWidth() ||
buttonImage.getHeight() != getHeight()) {
buttonImage = (BufferedImage)createImage(getWidth(),getHeight());
}
Graphics gButton = buttonImage.getGraphics();
gButton.setClip(g.getClip());
super.paint(gButton);
Graphics2D g2d = (Graphics2D)g;
AlphaComposite newComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,.5f);
g2d.setComposite(newComposite);
g2d.drawImage(buttonImage, 0, 0, null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.add(new TranslucentButton("Translucent Button"));
frame.setVisible(true);
}
});
}
}
3)setOpaque()
4双缓冲
5线程
java.swing.Timer 、SwingWorker