¿Cómo puedo hacer que este JButton sea visible? Cuando tengo el fondo de exploración progresiva JWindow ()?

¿Cómo puedo hacer que el JButton sea visible?

1) Cuando no se enciende ningún fondo progresivo: JButton está mostrando

enter image description here

2) Cuando no se enciende ningún fondo progresivo, se presiona JButton y sigue sin mostrar parpadeo:

enter image description here

3) Cuando se activa el fondo progresivo, JButton es invisible y al presionarlo veo un parpadeo y aparece JButton () y de nuevo se oculta automáticamente. << El problema está aquí, entonces ¿cómo puedo solucionarlo?

enter image description here

import java.awt.Color; import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Graphics; import javax.swing.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class ButtonTest extends JWindow implements MouseListener, MouseMotionListener { private static final long serialVersionUID = 1L; private JFrame frame = new JFrame(); private SoftJButton softButton1; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ButtonTest j = new ButtonTest(); j.createAndShowGUI(); } }); } public void createAndShowGUI() { softButton1 = new SoftJButton("Transparent Button"); softButton1.setBackground(Color.GREEN); softButton1.setAlpha(0.5f); softButton1.setDoubleBuffered(true); this.setLayout(new BorderLayout()); this.setBounds(100, 30, 200, 100); this.setBackground(new Color(0, 0, 0, 255)); this.setVisible(true); add(softButton1); } @Override public void paint(Graphics g) { super.paint(g); } public void mouseDragged(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public static class SoftJButton extends JButton { private static final JButton lafDeterminer = new JButton(); private static final long serialVersionUID = 1L; private boolean rectangularLAF; private float alpha = 1f; public SoftJButton() { this(null, null); } public SoftJButton(String text) { this(text, null); } public SoftJButton(String text, Icon icon) { super(text, icon); setOpaque(false); setFocusPainted(false); } public float getAlpha() { return alpha; } public void setAlpha(float alpha) { this.alpha = alpha; repaint(); } @Override public void paintComponent(java.awt.Graphics g) { java.awt.Graphics2D g2 = (java.awt.Graphics2D) g; g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); if (rectangularLAF && isBackgroundSet()) { Color c = getBackground(); g2.setColor(c); g.fillRect(0, 0, getWidth(), getHeight()); } super.paintComponent(g2); } @Override public void updateUI() { super.updateUI(); lafDeterminer.updateUI(); rectangularLAF = lafDeterminer.isOpaque(); } } } 

No está claro cómo funciona su fuente de video, pero parece ser incompatible con Swing debido a la mezcla de componentes pesados ​​y ligeros . Aunque los componentes awt no son transparentes, siempre puede dibujar su propio texto translúcido en el Frame y hacer pruebas de golpe manual, como se sugiere a continuación. También puede verificar si su API de fuente de video admite Double Buffering y Page Flipping .

enter image description here

 import java.awt.Color; import java.awt.AlphaComposite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Rectangle2D; /** @see http://stackoverflow.com/questions/6725618 */ public class AlphaFrame extends Frame { private static final Font font = new Font("Dialog", Font.BOLD, 24); private float alpha = 1f; private Rectangle rect = new Rectangle(); public static void main(String[] args) { AlphaFrame af = new AlphaFrame(); af.setTitle("Translucent Button"); af.setAlpha(0.5f); af.setForeground(Color.green); af.setBackground(Color.black); af.setVisible(true); } public AlphaFrame() { this.setSize(320, 240); this.setLocationRelativeTo(null); this.setBackground(Color.white); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); this.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (rect.contains(e.getPoint())) { System.out.println("Pressed."); } } }); repaint(); } @Override public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D) g; g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha)); g2.setColor(getForeground()); g2.setFont(font); FontMetrics fm = g2.getFontMetrics(); String s = getTitle(); Insets i = getInsets(); int dx = i.left + 10; int dy = i.top + fm.getHeight() + 10; Rectangle2D bounds = fm.getStringBounds(s, g); rect.x = dx + (int) bounds.getX() - 1; rect.y = dy + (int) bounds.getY() - 1; rect.width = (int) bounds.getWidth() + 1; rect.height = (int) bounds.getHeight() + 1; System.out.println(i + " \n" + bounds + "\n" + rect); g2.drawRect(rect.x, rect.y, rect.width, rect.height); g2.drawString(s, dx, dy); } public float getAlpha() { return alpha; } public void setAlpha(float alpha) { this.alpha = alpha; } } 
 import java.awt.event.*; import java.awt.Color; import java.awt.AlphaComposite; import java.awt.Dimension; import javax.swing.*; import javax.swing.UIManager.LookAndFeelInfo; public class ButtonTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ButtonTest().createAndShowGUI(); } }); } private JFrame frame; private SoftJButton softButton1; public void createAndShowGUI() { softButton1 = new SoftJButton("Transparent Button"); softButton1.setPreferredSize(new Dimension(800, 600)); frame = new JFrame(); frame.add(softButton1); frame.setLocation(150, 150); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); Timer alphaChanger = new Timer(30, new ActionListener() { private float incrementer = -.03f; @Override public void actionPerformed(ActionEvent e) { float newAlpha = softButton1.getAlpha() + incrementer; if (newAlpha < 0) { newAlpha = 0; incrementer = -incrementer; } else if (newAlpha > 1f) { newAlpha = 1f; incrementer = -incrementer; } softButton1.setAlpha(newAlpha); } }); alphaChanger.start(); Timer uiChanger = new Timer(5500, new ActionListener() { private LookAndFeelInfo[] laf = UIManager.getInstalledLookAndFeels(); private int index = 1; @Override public void actionPerformed(ActionEvent e) { try { UIManager.setLookAndFeel(laf[index].getClassName()); SwingUtilities.updateComponentTreeUI(frame); } catch (Exception exc) { exc.printStackTrace(); } index = (index + 1) % laf.length; } }); uiChanger.start(); } public static class SoftJButton extends JButton { private static final JButton lafDeterminer = new JButton(); private static final long serialVersionUID = 1L; private boolean rectangularLAF; private float alpha = 1f; public SoftJButton() { this(null, null); } public SoftJButton(String text) { this(text, null); } public SoftJButton(String text, Icon icon) { super(text, icon); setOpaque(false); setFocusPainted(false); } public float getAlpha() { return alpha; } public void setAlpha(float alpha) { this.alpha = alpha; repaint(); } @Override public void paintComponent(java.awt.Graphics g) { java.awt.Graphics2D g2 = (java.awt.Graphics2D) g; g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); if (rectangularLAF && isBackgroundSet()) { Color c = getBackground(); g2.setColor(c); g.fillRect(0, 0, getWidth(), getHeight()); } super.paintComponent(g2); } @Override public void updateUI() { super.updateUI(); lafDeterminer.updateUI(); rectangularLAF = lafDeterminer.isOpaque(); } } }