2017-04-20 100 views
0

我在YouTube上觀看了關於如何以Java顯示圖像的教程,並且他使用了一個名爲「Applet」和「Graphics」的東西來顯示它,我已經準備好了,並且我對此感到滿意。現在我打算做的是在屏幕中央放置一個鍍鉻徽標,透明且沒有背景,然後打開鍍鉻。我已經調用了你知道的CustomChrome類。自定義和東西。每當我開始使用chrome時,我只想要一個很酷的開放。Java小程序,使背景透明

下面是當前的代碼:

import java.applet.Applet; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.net.URL; 

public class CustomChrome extends Applet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private Image logo = null; 

    public void paint(Graphics g) { 

     this.setSize(960, 540); 

     if (logo == null) 
      logo = getImage("/chromelgo.png"); 

     Graphics2D g2 = (Graphics2D) g; 
     g2.drawImage(logo, 0, 0, 960, 540, this); 
    } 

    public Image getImage(String path) { 

     Image tempImage = null; 
     try { 

      URL imageURL = CustomChrome.class.getResource(path); 
      tempImage = Toolkit.getDefaultToolkit().getImage(imageURL); 
     } catch (Exception e) { 

      System.out.println("An error occured - " + e.getMessage()); 

     } 

     return tempImage; 
    } 


} 

我想要做什麼,然而,這是使背景+消失,一旦這樣做,我會的形象和窗口大小設置爲1920×1080的窗口。我怎樣才能讓圖像背後的窗口消失?我聽說過有關實現ActionListener的一些信息,但我仍不確定該怎麼做。

請記住!我用java沒有經驗擾亂你們很抱歉,如果您嘗試幫助我:P

+1

歡迎去年快技術的奇妙世界 - 小程序有效地棄用,你不應該再使用它們。作爲一般反饋,繪畫是用於繪畫的,你應該改變它內部組件的狀態(並且你不應該在applet中調用setSize);考慮使用ImageIO.read over Toolkit – MadProgrammer

+0

1)爲什麼要使用AWT?看到[這個答案](http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978)有很多很好的理由放棄AWT組件而轉向Swing。還要注意'JApplet'是'Applet'的Swing等價物。 2)要擴展@MadProgrammer的評論,請參閱[不支持Java插件的支持](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)和[轉移到無插件網頁](https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)。 –

+0

感謝您的幫助! :) – Marius

回答

1

好了,讓我們開始真正明顯的問題,小程序被有效地棄用,應停止使用它們,請參閱Java Plugin support deprecatedMoving to a Plugin-Free Web更多細節。

paintXxx用於繪畫,您不應該在繪畫方法中更改組件的狀態(並且您不應該在小程序中調用setSize)。請參閱有關如何繪畫作品詳細信息Painting in AWT and SwingPerforming Custom Painting以及如何利用它

作爲建議的一般一塊,我建議ImageIO.readToolkit#getImageImageIcon加載圖像,除了拋出Exception當圖像無法被讀取(而不是靜靜地失敗),它也是一個阻塞調用,這意味着當它返回時,圖像被完全加載。

更多細節

警告的字見Reading/Loading an Image - 你正在試圖做的是不是每說難,但它的參與,並要求有關API是如何工作的

一定量的知識

現在我正打算要提出的是在我的屏幕中央的鍍鉻標識,透明,無背景,然後打開Chrome瀏覽器。

好了,好了,這是永遠不會用小程序來工作,因爲小程序設計在瀏覽器裏面顯示出來,所以你無法控制的窗口,相反,你需要像一個JFrame,看到How to Make Frames (Main Windows)

我想要做什麼,然而,這是背景+消失的窗口,一旦這樣做,我會的形象和窗口大小設置爲1920×1080的化妝。我怎樣才能讓圖像背後的窗口消失?現在

,這纔是真正的樂趣開始的地方。您將首先看看How to Create Translucent and Shaped Windows。這將允許你控制框架的不透明度,使其消失,但允許內容保留,有一些技巧,你需要做的拉它,但這是基本思想

所以,這個例子將使一個透明的窗口和顯示器以及以此爲中心的圖像。

Example

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
         ex.printStackTrace(); 
        } 

        BufferedImage img = ImageIO.read(getClass().getResource("/Chrome.png")); 
        ImageIcon icon= new ImageIcon(img); 
        JLabel label = new JLabel(icon); 

        JFrame frame = new JFrame("Testing"); 
        frame.setUndecorated(true); 
        frame.setBackground(new Color(0, 0, 0, 0)); 
        frame.add(label); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

在這個例子中,我使用一個JLabel的顯示圖像,在大多數情況下,這是你真正需要的,請參閱How to Use Labels瞭解更多詳情。

我想要做什麼,然而,這是使背景+窗口消失

那麼,它只是歸結到你的意思是什麼消失。你可以只全部disposesetVisible的窗口,這將關閉它,你可以使用一些動畫,使之消失......並且,因爲我喜歡的動畫...

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
         ex.printStackTrace(); 
        } 

        BufferedImage img = ImageIO.read(getClass().getResource("/Chrome.png")); 
        ImageIcon icon = new ImageIcon(img); 
        JLabel label = new JLabel(icon); 

        JFrame frame = new JFrame("Testing"); 
        frame.setUndecorated(true); 
        frame.setBackground(new Color(0, 0, 0, 0)); 
        frame.add(label); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 

        Timer timer = new Timer(40, new ActionListener() { 
         float opacity = 1.0f; 
         float delta = 0.05f; 

         @Override 
         public void actionPerformed(ActionEvent e) { 
          opacity -= delta; 
          if (opacity < 0.0f) { 
           opacity = 0.0f; 
           ((Timer)(e.getSource())).stop(); 
           frame.dispose(); 
          } 
          frame.setOpacity(opacity); 
         } 
        }); 
        timer.setInitialDelay(2000); 
        timer.start(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

好了,有一個很多事情都在這裏進行,您需要閱讀Concurrency in SwingHow to use Swing Timers以瞭解更多細節,不用說,開始時有點複雜。

基本上,所有這些都是,等待2秒,然後每40毫秒,將幀不透明度減少一個因子或0.05,直到達到0,然後處理該窗口。現在,我可能會使用這些技術的混合,例如,我可能會顯示徽標框架(可能設置爲顯示在頂部),然後顯示主框架,然後觸發徽標框架淡出。這可以通過控制器類來簡化代碼,但是,這取決於您。

A還建議在看看Creating a GUI With JFC/Swing

+0

這工作完美無瑕!感謝您的幫助,並感謝您幫助我開始!我會檢查一切:) – Marius