gpt4 book ai didi

Java Applet,使背景透明

转载 作者:行者123 更新时间:2023-12-02 13:21:56 25 4
gpt4 key购买 nike

我在 YouTube 上观看了一个关于如何用 Java 显示图像的教程,他使用了一种称为“Applet”和“Graphics”的东西来显示它,我已经让它工作了,我对此感到满意。现在我计划在屏幕中央制作一个 chrome Logo ,透明,没有背景,然后 chrome 打开。我将这个类称为 CustomChrome,因为你知道。定制和东西。每当我启动 chrome 时,我只想有一个很酷的开头。

这是当前代码:

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;
}


}

但是,我想做的是使背景+窗口消失,完成后我会将图像和窗口大小设置为 1920x1080。我该如何继续使图像后面的窗口消失?我听说过一些关于实现 ActionListener 的消息,但我仍然不确定该怎么做。

记住!我没有使用 java 的经验,如果你试图帮助我,我很抱歉让你不高兴:P

最佳答案

好吧,让我们从真正明显的问题开始,小程序实际上已被弃用,您应该停止使用它们,请参阅 Java Plugin support deprecatedMoving to a Plugin-Free Web了解更多详情。

paintXxx 用于绘制,您永远不应该在绘制方法中更改组件的状态(并且您也不应该在小程序中调用 setSize)。请参阅Painting in AWT and SwingPerforming Custom Painting有关绘画如何工作以及如何使用它的更多详细信息

作为一般建议,我建议使用 ImageIO.read 而不是 Toolkit#getImageImageIcon 来加载图像,除了当无法读取图像时抛出异常(而不是默默地失败),它也是一个阻塞调用,这意味着当它返回时,图像已完全加载。

参见Reading/Loading an Image了解更多详情

警告一句话 - 您想要做的事情本身并不困难,但它涉及并需要一定的关于 API 如何工作的知识.

Now what I was planning to make is a chrome logo in the center of my screen, transparent with no background, and then chrome opens.

好吧,这永远不适用于小程序,因为小程序旨在显示在浏览器中,因此您无法控制窗口,相反,您需要诸如 JFrame 之类的东西>,参见 How to Make Frames (Main Windows)

What I want to do, however, is the make the background + the window to vanish, Once that's was done I will set the image and window size to 1920x1080. How do I go forward on making the window behind the image disappear?

现在,真正的乐趣开始了。您首先要查看 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了解更多详情。

What I want to do, however, is the make the background + the window to vanish

好吧,这只是归结为你所说的消失是什么意思。您可以只在窗口上使用 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,然后进行处理窗口的。

现在,我可能会混合使用这些技术,例如,我可能会显示 Logo 框架(可能设置为显示在顶部),然后我会显示主框架,然后触发 Logo 框架淡出。这可以通过 Controller 类来完成以简化代码,但是,这取决于您。

A 还建议查看 Creating a GUI With JFC/Swing

关于Java Applet,使背景透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43528495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com