java swing面板设置透明度_Java Swing透明度绘图问题

本文探讨了在Java Swing中设置面板透明度和进行透明度绘图时遇到的问题。在特定的JDK版本和操作系统上,透明度表现不一致。作者通过示例代码展示了如何创建一个带有背景图像的面板,并在其上添加组件,同时遇到的绘图异常表现为不完全重绘和间隔性更新。问题可以通过调整代码的某些部分来解决。
摘要由CSDN通过智能技术生成

它适用于Windows Sun JDK 1.6版本13和17

在Ubuntu 11.04 x64上,OpenJDK 1.6.0_22和Sun JDK 1.6.0_24都失败

我想要的是制作一个背景图像面板,在其上面有额外的面板(附加组件 - 例如JButtons,自定义形状等),然后绘制所有正确的图像。我在我的应用中使用了JLayeredPane,但为了举例,下面的代码应该足够了。无论下面的问题,我都乐于提供有关如何做我想做的事情的建议。

我遇到的问题是这幅画的表现真的很奇怪。它不会完全重新绘制(例如,只有图像上方的顶部),它会重新绘制 - 从我注意到间隔越来越大的步骤(例如,第1层油漆,第3层油漆,第9层油漆,第21层油漆,第64层油漆等)。 )。我的猜测是我在这里执行得太多 - 下面有什么明显的错误吗?

在另一个说明中,下面有三条注释行。有趣的是,取消注释其中的任何一个并评论以下行可解决问题。这些图像具有以下属性(并且它看起来并不重要 - 只是大小):

cat.jpg JPEG 640x533 640x533+0+0 8-bit DirectClass 110KB 0.000u 0:00.000

cat-small.jpg JPEG 200x167 200x167+0+0 8-bit DirectClass 7.99KB 0.000u 0:00.000以下是我遇到的Java代码:

import java.awt.Color;

import java.awt.Container;

import java.awt.Graphics;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.UIManager;

public class SwingDrawingPrb {

public static void main(String[] args) throws Exception {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

final JFrame frame = new JFrame("SwingDrawingPrb");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final Container contentPane = frame.getContentPane();

frame.setLocation(550, 50);

frame.setSize(1000, 800);

frame.setVisible(true);

// ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat-small.jpg"));

ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat.jpg"));

final JPanel imagePanel = new JPanel() {

// Color trans = new Color(255, 0, 0, 255);

Color trans = new Color(255, 0, 0, 64);

protected void paintComponent(Graphics g) {

System.out.println("painting");

g.setColor(Color.white);

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(trans);

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(Color.blue);

g.drawLine(0, 0, 1000, 1000);

}

};

imagePanel.setBounds(0, 0, image.getIconWidth() + 200, image.getIconHeight() + 200);

imagePanel.setLayout(null);

// JLabel imageLabel = new JLabel("Hello, world!");

JLabel imageLabel = new JLabel(image);

imageLabel.setBounds(100, 100, image.getIconWidth(), image.getIconHeight());

imageLabel.addMouseMotionListener(new MouseAdapter() {

public void mouseMoved(MouseEvent e) {

System.out.println("mouseMoved");

imagePanel.repaint();

}

});

imagePanel.add(imageLabel);

contentPane.add(imagePanel);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值