当前位置: 首页 > 面试题库 >

Java在半透明框架/面板/组件上重新绘画。

唐腾
2023-03-14
问题内容

我正在尝试在OSX上使用Java创建一个半透明窗口并将其添加JLabel到其中。

JLabel每秒更改一次文本。

替代文字

但是,该组件不能很好地重新粉刷。

我怎么解决这个问题?

我已经找到了这些 文章,但是我不知道该如何解决。

如果可能,请粘贴修复源代码,这是我的:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Font;
import java.util.Timer;
import java.util.TimerTask;

public class Translucent {
    public static void main( String [] args ) {

        JFrame frame = new JFrame();

        frame.setBackground( new Color( 0.0f,0.0f,0.0f,0.3f));

        final JLabel label =  new JLabel("Hola");
        label.setFont( new Font( label.getFont().getFamily(), Font.PLAIN, 46 ) );
        label.setForeground( Color.white );

        frame.add( label );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

        Timer timer = new Timer();
        timer.schedule( new TimerTask(){
            int i = 0;
            public void run() {
                label.setText("Hola "+ i++ );
            }
        }, 0, 1000 );


    }   
}

问题答案:

我有一些运气可以扩展JLabel和实现,Icon以使半透明组件按我想要的方式工作。你可以在此AlphaCompositeDemo中看到各种规则组合的结果。下面的示例是100%白色,50%黑色。

附录:请注意,此示例如何在半透明框架背景上的透明屏幕外背景上合成不透明文本。

附录:这是使整个框架透明的一种方法。不幸的是,它也使内容变暗。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Translucent extends JPanel implements ActionListener {

    private static final int W = 300;
    private static final int H = 100;
    private static final Font font =
        new Font("Serif", Font.PLAIN, 48);
    private static final SimpleDateFormat df =
        new SimpleDateFormat("HH:mm:ss");
    private final Date now = new Date();
    private final Timer timer = new Timer(1000, this);
    private BufferedImage time;
    private Graphics2D timeG;

    public Translucent() {
        super(true);
        this.setPreferredSize(new Dimension(W, H));
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        int w = this.getWidth();
        int h = this.getHeight();
        g2d.setComposite(AlphaComposite.Clear);
        g2d.fillRect(0, 0, w, h);
        g2d.setComposite(AlphaComposite.Src);
        g2d.setPaint(g2d.getBackground());
        g2d.fillRect(0, 0, w, h);
        renderTime(g2d);
        int w2 = time.getWidth() / 2;
        int h2 = time.getHeight() / 2;
        g2d.setComposite(AlphaComposite.SrcOver);
        g2d.drawImage(time, w / 2 - w2, h / 2 - h2, null);
    }

    private void renderTime(Graphics2D g2d) {
        g2d.setFont(font);
        String s = df.format(now);
        FontMetrics fm = g2d.getFontMetrics();
        int w = fm.stringWidth(s);
        int h = fm.getHeight();
        if (time == null && timeG == null) {
            time = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            timeG = time.createGraphics();
            timeG.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
            timeG.setFont(font);
        }
        timeG.setComposite(AlphaComposite.Clear);
        timeG.fillRect(0, 0, w, h);
        timeG.setComposite(AlphaComposite.Src);
        timeG.setPaint(Color.green);
        timeG.drawString(s, 0, fm.getAscent());
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBackground(new Color(0f, 0f, 0f, 0.3f));
        f.setUndecorated(true);
        f.add(new Translucent());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        now.setTime(System.currentTimeMillis());
        this.repaint();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                create();
            }
        });
    }
}


 类似资料:
  • 我们有一个TextView,其中包含应用程序资源中的可抽屉-左和可抽屉-右。在一些设备上 运行Android 4.1.2的索尼Xperia L, 三星Galaxy Young或 三星Galaxy SII 我们正面临一个奇怪的问题。可拉拔件将显示为半透明/透明。在其他设备上,如 三星Galaxy S4(4.4.2)或 HTC ONE V(4.0.3) 可抽屉将正确显示。 这是布局定义的剪裁: 在HT

  • 问题内容: 我目前正在为一个大学课程从事小组项目,但是遇到了一些绊脚石。我们已决定要实现的程序是一个具有中央服务器的对等聊天客户端,该服务器用于存储和共享用户名等。我已被分配去做GUI。 一位朋友开玩笑地建议我加入“火红的背景!” 因此,我决定这样做,但是要有一个用户选择的背景图像。照原样,只有一点点背景图像可见,所有组件都位于其上方,因此我决定尝试实现半透明。 这是我的问题所在: 从输入框向聊天

  • 我在java swing中有一个UI需求,其中我需要实现以下内容: 顶部的两个按钮放在一个JPanel中。我需要画一条线通过该面板的中心,直到两个按钮的开始。下面的面板是以卡片布局排列的面板的容器。当按钮被点击时,卡片被切换显示另一个面板。 因此,在所有方面,它看起来都像一个JTabbedPane,但有一点不同,选项卡是排列在选项卡窗格中心的按钮。我需要为我正在构建的UI提供这种差异。 正如您所看

  • 问题内容: 我遇到一个问题:在我的Java应用程序中,我有一个AWT组件(无法更改该组件),该组件可以流式传输并显示一个avi文件。现在,我想借鉴这部电影,并考虑将透明的JPanel放在其上并在其上进行绘制。 这是行不通的,因为我看不到视频流或画出的线条,但不能同时看到这两者。 我在某处读到AWT不支持组件的透明性-但是该面板是能够做到这一点的JPanel。 有人可以帮我吗-提前谢谢。 问题答案:

  • 我试图将一个半透明的橡皮刷写进我正在开发的应用程序中,但发现了两个问题,这取决于它的实现方式。希望有一个解决办法,我可以指出。 代码示例在mono droid/xamarin中 所以,我通常有一个设置,在画布上绘制路径。我的视图的方法绘制它的基本位图,然后在其上绘制我的路径。 有人有什么东西我可以看一下,可以提出解决方案吗?Java很好,因为它很容易移植到C#。 多谢!奈杰尔

  • 我试图在另外两个面板的顶部放置两个面板,以便位置完全匹配。这将允许我在之前(底部)面板的顶部进行绘制。这样做的原因是,我实现了“拖动矩形”缩放功能,因此在面板上,用户将拖动鼠标以绘制矩形,然后面板将充满该矩形的内容。但是,我现在决定在用户拖动矩形时,将其包含在可视化表示中。 由于我(假设)无法在底部面板上绘制矩形,因为它上面已经有一个复杂的油漆,我想我可以将它绘制到另一个面板上,我将放置在顶部。(