简体   繁体   中英

Java Swing transparency drawing issues

Edit:

I submitted a bug for the below (it may take aa 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 - eg 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 (eg only the top part above the image), it repaints in - from what I've noticed increasingly spaced - steps (eg 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);

See Backgrounds With Transparency for more information.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM