好了,讓我們開始真正明顯的問題,小程序被有效地棄用,應停止使用它們,請參閱Java Plugin support deprecated和Moving to a Plugin-Free Web更多細節。
paintXxx
用於繪畫,您不應該在繪畫方法中更改組件的狀態(並且您不應該在小程序中調用setSize
)。請參閱有關如何繪畫作品詳細信息Painting in AWT and Swing和Performing Custom Painting以及如何利用它
作爲建議的一般一塊,我建議ImageIO.read
在Toolkit#getImage
或ImageIcon
加載圖像,除了拋出Exception
當圖像無法被讀取(而不是靜靜地失敗),它也是一個阻塞調用,這意味着當它返回時,圖像被完全加載。
更多細節
警告的字見Reading/Loading an Image - 你正在試圖做的是不是每說難,但它的參與,並要求有關API是如何工作的
一定量的知識
現在我正打算要提出的是在我的屏幕中央的鍍鉻標識,透明,無背景,然後打開Chrome瀏覽器。
好了,好了,這是永遠不會用小程序來工作,因爲小程序設計在瀏覽器裏面顯示出來,所以你無法控制的窗口,相反,你需要像一個JFrame
,看到How to Make Frames (Main Windows)
我想要做什麼,然而,這是背景+消失的窗口,一旦這樣做,我會的形象和窗口大小設置爲1920×1080的化妝。我怎樣才能讓圖像背後的窗口消失?現在
,這纔是真正的樂趣開始的地方。您將首先看看How to Create Translucent and Shaped Windows。這將允許你控制框架的不透明度,使其消失,但允許內容保留,有一些技巧,你需要做的拉它,但這是基本思想
所以,這個例子將使一個透明的窗口和顯示器以及以此爲中心的圖像。
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瞭解更多詳情。
我想要做什麼,然而,這是使背景+窗口消失
那麼,它只是歸結到你的意思是什麼消失。你可以只全部dispose
或setVisible
的窗口,這將關閉它,你可以使用一些動畫,使之消失......並且,因爲我喜歡的動畫...
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 Swing和How to use Swing Timers以瞭解更多細節,不用說,開始時有點複雜。
基本上,所有這些都是,等待2秒,然後每40毫秒,將幀不透明度減少一個因子或0.05
,直到達到0
,然後處理該窗口。現在,我可能會使用這些技術的混合,例如,我可能會顯示徽標框架(可能設置爲顯示在頂部),然後顯示主框架,然後觸發徽標框架淡出。這可以通過控制器類來簡化代碼,但是,這取決於您。
A還建議在看看Creating a GUI With JFC/Swing
歡迎去年快技術的奇妙世界 - 小程序有效地棄用,你不應該再使用它們。作爲一般反饋,繪畫是用於繪畫的,你應該改變它內部組件的狀態(並且你不應該在applet中調用setSize);考慮使用ImageIO.read over Toolkit – MadProgrammer
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)。 –
感謝您的幫助! :) – Marius