java swing 透明度,Java Swing透明度绘图问题

这篇博客讨论了一个在Ubuntu 11.04 x64上使用Java Swing进行图形绘制时遇到的问题。作者发现使用JLayeredPane在背景图片上添加组件并绘制时,重绘行为异常,表现为只部分重绘且间隔性更新。问题在于JPanel的不透明设置。解决方案是将imagePanel.setOpaque(false),这使得面板变得透明,从而解决了绘画问题。
摘要由CSDN通过智能技术生成

Edit:

I submitted a bug for the below (it may take a a few days to become approved though):

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043319

Some more details:

It works with Windows Sun JDK 1.6 versions 13 and 17

It fails on Ubuntu 11.04 x64 with both OpenJDK 1.6.0_22 and Sun JDK 1.6.0_24

What I want is to make a background image panel with additional panels on top of it (with additional components - e.g. JButtons, custom shapes, etc. - in them) and draw all that correctly. I'm using JLayeredPane for that purpose in my app, but for the sake of an example the below code should suffice. I'm open to suggestions about how to do what I want regardless of the below problem.

I'm running into the issue that the painting is behaving really weird. It doesn't repaint fully (e.g. only the top part above the image), it repaints in - from what I've noticed increasingly spaced - steps (e.g. 1st paint, 3rd paint, 9th paint, 21st paint, 64th paint, etc.). My guess is that I'm going too much into implementation here - is there anything obviously wrong with the below?

On a separate note, there are three commented lines below. Interestingly enough, uncommenting any of them and commenting the following line solves the problem. The images are with the following attributes (and it seems it doesn't matter which image - just the size):

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

Here's the Java code I'm having issues with:

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

}

}

解决方案

You need to add:

imagePanel.setOpaque(false);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值