掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
能不能讓Swing控件也有漸隱和漸顯的效果呢,答案當(dāng)然是肯定的。這里也要說(shuō)明一下Swing這些高級(jí)特性的實(shí)現(xiàn)機(jī)制。Swing里的特效不是靠調(diào)用一個(gè)方法就可以實(shí)現(xiàn)的,而是要我們自己去寫這些方法,主要還是重寫Swing的public void paint(Graphics g)方法。Swing的一切樣式說(shuō)白了都是利用paint方法“畫”上去的,所以說(shuō)Swing比較慢,當(dāng)然如果我們考慮Swing主要用來(lái)做客戶端顯示的,稍微慢一點(diǎn)也是可以接受的。

創(chuàng)新互聯(lián)成立10年來(lái),這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、國(guó)際域名空間、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過(guò)對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
下面說(shuō)Swing的控件的漸顯效果,我想原理還是蠻簡(jiǎn)單的,不斷改變控件的透明度即可。即g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
下面是完整的控件代碼,該控件您可以認(rèn)為是一個(gè)類似JPanel的容器:
- package com.zakisoft.frame;
- import java.awt.AlphaComposite;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.image.BufferedImage;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import javax.swing.Timer;
- /**
- * @author zakisoft.com
- *
- */
- public class ZPanel extends javax.swing.JComponent implements ActionListener {
- private static final long serialVersionUID = 1L;
- private BufferedImage image;
- private static final int ANIMATION_FRAMES = 100;
- private static final int ANIMATION_INTERVAL = 10;
- private int frameIndex;
- // 時(shí)鐘
- private Timer timer;
- public BufferedImage getImage() {
- return image;
- }
- public void setImage(BufferedImage image) {
- this.image = image;
- }
- private int imgWidth;
- private int imgHeight;
- public int getImgWidth() {
- return imgWidth;
- }
- public void setImgWidth(int imgWidth) {
- this.imgWidth = imgWidth;
- }
- public int getImgHeight() {
- return imgHeight;
- }
- public void setImgHeight(int imgHeight) {
- this.imgHeight = imgHeight;
- }
- public ZPanel() {
- }
- public void setImagePath(String imgPath) {
- // 該方法不推薦使用,該方法是懶加載,圖像并不加載到內(nèi)存,當(dāng)拿圖像的寬和高時(shí)會(huì)返回-1;
- // image = Toolkit.getDefaultToolkit().getImage(imgPath);
- try {
- // 該方法會(huì)將圖像加載到內(nèi)存,從而拿到圖像的詳細(xì)信息。
- image = ImageIO.read(new FileInputStream(imgPath));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- setImgWidth(image.getWidth(this));
- setImgHeight(image.getHeight(this));
- }
- public void paintComponent(Graphics g) {
- int x = 0;
- int y = 0;
- if (null == image) {
- return;
- }
- g.drawImage(image, x, y, image.getWidth(null), image.getHeight(null),
- null);
- }
- public void paint(Graphics g) {
- if (isAnimating()) {
- // 根據(jù)當(dāng)前幀顯示當(dāng)前透明度的內(nèi)容組件
- float alpha = (float) frameIndex / (float) ANIMATION_FRAMES;
- Graphics2D g2d = (Graphics2D) g;
- g2d.setComposite(AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER, alpha));
- // Renderer渲染機(jī)制
- super.paint(g2d);
- } else {
- // 如果是***次,啟動(dòng)動(dòng)畫時(shí)鐘
- frameIndex = 0;
- timer = new Timer(ANIMATION_INTERVAL, this);
- timer.start();
- }
- }
- // 判斷當(dāng)前是否正在進(jìn)行動(dòng)畫
- private boolean isAnimating() {
- return timer != null && timer.isRunning();
- }
- // 關(guān)閉時(shí)鐘,重新初始化
- private void closeTimer() {
- if (isAnimating()) {
- timer.stop();
- frameIndex = 0;
- timer = null;
- }
- }
- // 動(dòng)畫時(shí)鐘處理事件
- public void actionPerformed(ActionEvent e) {
- // 前進(jìn)一幀
- frameIndex++;
- if (frameIndex >= ANIMATION_FRAMES)
- // ***一幀,關(guān)閉動(dòng)畫
- closeTimer();
- else
- // 更新當(dāng)前一幀
- repaint();
- }
- }
我們利用控件的public void paint(Graphics g) 方法,來(lái)設(shè)置控件的透明度,然后利用super.paint(g2d)方法重繪頁(yè)面;重繪時(shí)系統(tǒng)會(huì)自動(dòng)調(diào)用public void actionPerformed(ActionEvent e) 方法,我們?cè)谶@里來(lái)改變控件的透明度,并且判斷控件是否加載完畢,加載完畢就停止計(jì)時(shí)器。
很簡(jiǎn)單,效果還不錯(cuò)吧,附件是完整的運(yùn)行代碼。按“圖片漸顯”按鈕,可以反復(fù)查看效果。
下圖是加載時(shí)界面:
下圖是加載完成界面:

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流