将背景更改为半透明颜色时在 JButton 上显示的随机文本 [重复]

Random text showing on JButton when changing background to translucent color [duplicate]

提问人:davidalayachew 提问时间:9/15/2023 最后编辑:davidalayachew 更新时间:9/16/2023 访问量:88

问:

如果我将我的文本更改为半透明颜色(0 < alpha < 1),我的文本会得到不稳定的结果。JButtonJButton


package Paint;

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

public class GUI
{

   public GUI()
   {
   
      final JFrame frame = new JFrame();
   
      frame.setTitle("Paint");
      frame.setLocationByPlatform(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
      frame.add(createMainPanel());
   
      frame.pack();
      frame.setVisible(true);
      
      // System.out.println(JColorChooser.showDialog(null, "Choose a color", null, true));
   
   }
   
   private static JPanel createMainPanel()
   {
   
      final JPanel mainPanel = new JPanel(new BorderLayout());
      
      final JPanel topPanel = GUI.createTopPanel();
      
      mainPanel.add(topPanel, BorderLayout.NORTH);
      
      return mainPanel;
   
   }
   
   private static JPanel createTopPanel()
   {
   
      final JPanel topPanel = new JPanel();
      topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
      
      topPanel.add(GUI.createColorChooserPanel());
      
      return topPanel;
   
   }
   
   private static JPanel createColorChooserPanel()
   {
   
      final int NUM_ROWS = 3;
      final int NUM_COLUMNS = 3;
      final String DIALOG_TITLE = "Choose a color";
      final java.util.List<Character> KEY_LIST = 
         java.util.List.of('U', 'I', 'O', 'H', 'J', 'K', 'B', 'N', 'M');
   
      final JPanel colorChooserPanel = new JPanel(new GridLayout(NUM_ROWS, NUM_COLUMNS));
      
      for (int index = 0; index < NUM_ROWS * NUM_COLUMNS; index++)
      {
      
         final JButton button = new JButton("" + KEY_LIST.get(index));
         button.setFont(button.getFont().deriveFont(20.0f));
         button.setOpaque(true);
         button
            .addActionListener
            (
               event -> 
                  button
                     .setBackground
                     (
                        JColorChooser
                           .showDialog
                           (
                              button, 
                              DIALOG_TITLE, 
                              button.getBackground(), 
                              true
                           )
                     )
            );
      
         colorChooserPanel.add(button);
      
      }
      
      return colorChooserPanel;
   
   }

}

单击中心按钮,选择一种颜色,转到 RGB 选项卡,将 alpha 更改为在上述范围内,然后单击确定。然后,将鼠标快速悬停在按钮上。你应该像乱码一样不稳定的结果。

以下是一些不稳定结果的照片。

以前

单击中心按钮,然后选择一种颜色

单击“RGB”选项卡,然后更改 ALPHA 值

单击“确定”,现在 JBUTTON 的背景不稳定

更多

在中心按钮和其他按钮之间移动鼠标似乎会更改中心按钮的文本。

编辑 - 我正在构建 Microsoft Paint 的克隆,这个特定的功能是重新创建以下屏幕截图右上角的颜色选择器。喜欢这个。

我计划使用 JColorChooser.showDialog(Component, String title, Color) 作为用户选择颜色的弹出窗口。但是一旦他们这样做了,我想将该颜色带回他们单击的组件(当前是),以便他们下次可以看到并选择它。JButton

编辑 2 - 如果我设置为 0,会发生什么情况。alpha

选择颜色为 0ALPHA

结果 -- 相同的问题,不同的颜色深浅

Java Swing 背景颜色 不透明度 视觉故障

评论

3赞 MadProgrammer 9/15/2023
Swing 组件不支持基于 Alpha 的颜色
2赞 MadProgrammer 9/15/2023
摆动组件要么完全不透明,要么完全透明。您可以“伪造”它,但您可能不喜欢这种效果,因为您需要将组件设置为透明(即)并覆盖它的方法并自己绘制颜色 - 例如setOpaque(false)paintComponent
1赞 sorifiend 9/15/2023
@davidalayachew 你这样做的目的是什么?您希望能够看到按钮后面的背景图像吗?根据您的目标,有不同的方法可以伪造它,或者使用完全不同的方法
1赞 camickr 9/16/2023
对于 alpha 值为 0,请使用 setOpaque( false )。对于其他 alpha 值,您可以使用“具有透明度的背景”中所示的值,这样您就不必一直执行自定义绘制,如 stackoverflow.com/a/3562529/131872 中所示。AlphaContainer
1赞 MadProgrammer 9/16/2023
@davidalayachew 你说“实际上,它甚至支持透明吗?”——但我已经说过“Swing 组件要么是完全不透明的,要么是完全透明的”,并希望澄清“透明”(透视)和“半透明”(部分透视 - 或 alpha 基色)之间的区别

答: 暂无答案