【问题标题】:How to set the Opacity of Text in a JComboBox list?如何在 JComboBox 列表中设置文本的不透明度?
【发布时间】:2021-01-03 11:59:31
【问题描述】:

当前尝试生成带有字符串列表的 ComboBox,并希望这些字符串值具有一定的不透明度。 CombobBox 本身应该保持正常,只有数据发生变化。

通过实现我自己的自定义类,我能够使用我的图标组合框来实现这一点。

    ///This works great when ICons are used within the JComboBox
    class MyImageIconObject extends ImageIcon
    {
        float x;
        ImageIcon ic;
        public MyImageIconObject(String iconLocation)
        {
            super(iconLocation);
            this.ic = new ImageIcon(iconLocation); 
        }
    
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            //super.paintIcon(c, g, x, y);
            ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.25f));
            ic.paintIcon(c, g, x, y);
            System.out.println("Painting 2");
        }
    }

以上代码生成如下结果。

不能对 Strings 执行此操作,因为它是一个 Final 类,但即使我可以,也没有可覆盖的 paint() 类型函数。

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class JComboBoxWithStrings extends JFrame
{
    private JComboBox comboBox;
    JPanel topPanel;
    String[] arrayOfStrings = {"String 1", "Entry 2", "More data", "Entry 10000"};
    
    public JComboBoxWithStrings ()
    {
        
    }
    
    public static void main(String[] args)  
    {

        JComboBoxWithStrings T = new JComboBoxWithStrings();
        T.createGUI();
        T.setVisible(true);        
    }
    public void createGUI(){

        setMinimumSize(new Dimension(500,500));
        setTitle("Demo");
        setLocation(200, 200);

        topPanel = new JPanel();
        getContentPane().add(topPanel, BorderLayout.CENTER);

        comboBox = new JComboBox(arrayOfStrings);
        
        topPanel.add(comboBox);

        super.addWindowListener(new WindowAdapter() {           
            public void windowClosing(WindowEvent e) {              
                dispose();          
            }           
        }); 
    }
}

上面的代码生成如下:

需要什么才能控制 ComboBox 中显示的字符串的不透明度同时保持 ComboBox 本身正常?

【问题讨论】:

  • 其实没那么难。您需要创建一个自定义 ListCellRenderer 并在 JCombo 上使用 setRenderer 和一个实例:docs.oracle.com/javase/8/docs/api/javax/swing/…
  • 添加渲染器是有意义的,但不透明度的设置是否与图标的设置方式相似?据我所见,大多数示例都涉及通过手动设置背景/前景来模仿行为。
  • @camickr 为您发布了解决方案

标签: java string swing combobox opacity


【解决方案1】:

控制ComboBox中显示的字符串的不透明度同时保持ComboBox本身正常?

使用自定义渲染器来检查渲染是针对下拉菜单还是 组合框:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.basic.*;

public class ComboBoxTransparent extends JFrame
{
    public ComboBoxTransparent()
    {
        Object[] items = { Color.red, Color.green, Color.blue };
        JComboBox comboBox = new JComboBox( items );
        comboBox.setRenderer( new TransparentRenderer() );
        getContentPane().add( comboBox, BorderLayout.NORTH );
        add( new JTextField(), BorderLayout.SOUTH);
    }

    public static void main(String[] args)
    {
        ComboBoxTransparent frame = new ComboBoxTransparent();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    class TransparentRenderer extends BasicComboBoxRenderer
    {
        private Color transparent = new Color(0, 0, 0, 128);

        public Component getListCellRendererComponent(
            JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            if (index == -1)
                setForeground( Color.BLACK );
            else
                setForeground( transparent );

            return this;
        }
    }
}

【讨论】:

  • 感谢您的帮助。我排除了 IF 条件,以便所有项目都获得 setForeground(tranparent) 调用,并且所有项目都变得透明,除了所选项目。与您的代码的一个区别是我的 Renderer 实现了 ListCellRenderer。这些是函数中仅有的 2 个调用。 JLabel 渲染器 = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); renderer.setForeground(透明);
  • 并且所有项目都变得透明,除了选定的项目 - 您的更改没有任何意义。如果您希望所有文本都是透明的,那么您只需设置组合框的前景色。我使用自定义渲染器的原因是为了区分您的需求的两种状态。
  • 很高兴它有帮助。不要忘记点击复选标记(答案旁边)“接受”答案,这样人们就知道问题已经解决了。
  • 好的,这让它变得容易多了,而不必担心渲染器。我期待它像图标一样更多地参与。通过使用 combobox.setForeground() 它可以在您滚动列表时工作,但是一旦列表关闭,所选项目就会再次恢复到其实体设置。
  • 看起来影响了选定的项目我需要返回渲染器并使用以下代码行:list.setSelectionForeground(transparent);除非有更简单的方法。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2011-05-26
  • 2011-04-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多