Obecnie próbuje wygenerować combobox z listą łańcuchów i chcesz, aby te wartości ciągu miały pewną nieprzezroczystość. Sam Calvobbox powinien pozostać normalnie i tylko zmiana danych.

Byłem w stanie tego osiągnąć z moim combobox ikon, wdrażając moją własną klasę niestandardową.

    ///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");
        }
    }

Powyższy kod generuje następujące wyniki.

enter image description here

Nie mogę tego zrobić dla ciągów, ponieważ jest to klasa końcowa, ale nawet jeśli nie mogę, nie ma funkcji typu farby () do zastąpienia.

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

Powyższy kod generuje:

enter image description here

Co jest wymagane tak, że jestem w stanie kontrolować nieprzezroczystość strun wyświetlanych w Combobox, zachowując normalny kombobox?

0
Unhandled Exception 16 wrzesień 2020, 18:49

1 odpowiedź

Najlepsza odpowiedź

Kontroluj nieprzezroczystość strun wyświetlanych w Combobox, zachowując normalny kombobox?

Użyj niestandardowego renderera, który sprawdza, czy renderowanie jest dla rozwijanej lub kombobox:

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;
        }
    }
}
1
camickr 16 wrzesień 2020, 17:09