我怎样才能使这个JButton可见? 当我有逐行扫描背景JWindow()?

我怎样才能使JButton可见?

1)当没有渐进背景打开:JButton显示

在这里输入图像说明

2)当没有渐进背景打开时,JButton按下仍然没有闪烁:

在这里输入图像说明

3)当渐进背景打开时,JButton是不可见的,在这个按下我看到闪烁和JButton()出现,并再次隐藏自动。 “问题在这里,那我该如何解决呢?

在这里输入图像说明

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

Solutions Collecting From Web of "我怎样才能使这个JButton可见? 当我有逐行扫描背景JWindow()?"

目前还不清楚您的视频源是如何工作的,但由于混合了重量级和轻量级组件 ,它似乎与Swing不兼容。 尽管awt组件不透明,但您可以在Frame上绘制自己的半透明文本,然后执行手动命中测试,如下所示。 你也可以检查你的视频源API是否支持双缓冲和页面翻转

在这里输入图像说明

 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.addWindowlistner(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); this.addMouselistner(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 Actionlistner() { 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 Actionlistner() { 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(); } } }