Ошибка прозрачности в компонентах качания - PullRequest
0 голосов
/ 16 сентября 2018

У меня были проблемы с прозрачностью JCombobox, используя Color (p, p, p, p).как только я нажимаю на нее, все отображаемые параметры, кажется, выбираются курсором, когда он находится только на одном из них.и иногда другие кнопки появляются за компонентом de прозрачности, но они не позади него.

Прозрачность действительно работает, но я не хочу, чтобы она выглядела ошибочной, я пытался использовать метод paintComponents ()с заливкой прямоугольника, и он работал только для jcombobox, когда его параметры не отображаются, он кажется идеальным и не содержит ошибок, но как только я отображаю параметры комбинированного списка, кажется, что все они выделены и с тенями других компонентов позади них,Есть ли способ получить отображаемый компонент jcombobox, который содержит параметры, и установить непрозрачный фон или что-то для решения этой проблемы?

вот код панели, где у меня есть 3 кнопки с MyComboBoxи тестовый класс:

//========================== MYCOMBOBOX CLASS ===========================

package views;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComboBox;

import models.EnumModels;

public class MyComboBox<E> extends JComboBox<E> {

    public MyComboBox () {
        setOpaque(false);
        setBackground(new Color(18, 10, 44, 100));
    }

    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
}
//======================= PANEL WITH MYCOMBOBOX ====================


package views;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import controller.Actions;
import controller.EventsController;
import models.EnumModels;

public class CentralPanel extends JPanel{

    MyButton info, add, recent, modelFilter;

    boolean bool;

    JTextField modelField;

    MyComboBox<EnumModels> modelsBox;

    public CentralPanel() {
        setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        setSize(600,845);
        setOpaque(false);
        setBackground(new Color(18, 10, 44, 100));
        setBorder(BorderFactory.createLineBorder(Color.decode("#E80909"), 4, true));

        JPanel infoPanel = new JPanel();
        infoPanel.setLayout(new BorderLayout());
        infoPanel.setBorder(BorderFactory.createEmptyBorder(100, 65, 0, 65));
        JPanel addPanel = new JPanel();
        addPanel.setLayout(new BorderLayout());
        addPanel.setBorder(BorderFactory.createEmptyBorder(100, 65, 0, 65));
        JPanel recentPanel = new JPanel();
        recentPanel.setLayout(new BorderLayout());
        recentPanel.setBorder(BorderFactory.createEmptyBorder(100, 65, 0, 65));
        JPanel modelFilterPanel = new JPanel();
        modelFilterPanel.setLayout(new BorderLayout());
        modelFilterPanel.setBorder(BorderFactory.createEmptyBorder(100, 65, 65, 65));


        info = new MyButton();
        info.setFont(new Font("Unispace", Font.BOLD, 24));
        info.setForeground(Color.decode("#E80909"));
        info.setText("Información de Vehículos");
        add = new MyButton();
        add.setFont(new Font("Unispace", Font.BOLD, 24));
        add.setForeground(Color.decode("#E80909"));
        add.setText("Agregar Vehículo");
        recent = new MyButton();
        recent.setFont(new Font("Unispace", Font.BOLD, 24));
        recent.setForeground(Color.decode("#E80909"));
        recent.setText("Vehículos Recientes");
        modelFilter = new MyButton();
        modelFilter.setFont(new Font("Unispace", Font.BOLD, 24));
        modelFilter.setForeground(Color.decode("#E80909"));
        modelFilter.setText("Filtro de Modelo");

        modelsBox = new MyComboBox<>();
        DefaultComboBoxModel model = new DefaultComboBoxModel<>(EnumModels.values());

        modelsBox.setModel(model);
//      modelsBox.setBackground(new Color(18, 10, 44, 100));
        modelsBox.setForeground(Color.decode("#8A7676"));
        modelsBox.setFont(new Font("Unispace", Font.BOLD, 20));
        ((JLabel)modelsBox.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
        ((JLabel)modelsBox.getRenderer()).setFocusable(false);
//      ((JLabel)modelsBox.getRenderer()).setOpaque(false);
//      ((JLabel)modelsBox.getRenderer()).setBackground(new Color(18, 10, 44,100));

        info.addActionListener(EventsController.getInstance());
        info.setActionCommand(Actions.MAIN_INFO.name());
        add.addActionListener(EventsController.getInstance());
        add.setActionCommand(Actions.MAIN_ADD.name());
        recent.addActionListener(EventsController.getInstance());
        recent.setActionCommand(Actions.MAIN_RECENT.name());
        modelFilter.addActionListener(EventsController.getInstance());
        modelFilter.setActionCommand(Actions.MAIN_FILTER.name());

        infoPanel.add(info);
        infoPanel.setOpaque(false);
        addPanel.add(add);
        addPanel.setOpaque(false);
        recentPanel.add(recent);
        recentPanel.setOpaque(false);
        modelFilterPanel.add(modelsBox);
        modelFilterPanel.setOpaque(false);

        add(infoPanel);
        add(addPanel);
        add(recentPanel);
        add(modelFilterPanel);

    }

    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }


///================================ MAIN RUNNER ============================

package test;

import java.awt.Image;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

import views.CentralPanel;

public class TestViews extends JFrame {

    CentralPanel panel;

    public TestViews() {
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        panel = new CentralPanel();
        add(panel);
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestViews();
    }
}

//================================ ENUM-COMBOBOX =============================

package models;

public enum EnumModels {


    NOVENTA("1990"),NOVENTA_UNO("1991"),NOVENTA_DOS("1992"),NOVENTA_TRES("1993"),NOVENTA_CUATRO("1994"),NOVENTA_CINCO("1995"),NOVENTA_SEIS("1996"),NOVENTA_SIETE("1997"),NOVENTA_OCHO("1998"),NOVENTA_NUEVE("1999"),
    DOSMIL_UNO("2001"),DOSMIL_DOS("2002"),DOSMIL_TRES("2003"),DOSMIL_CUATRO("2004"),DOSMIL_CINCO("2005"),DOSMIL_SEIS("2006"),DOSMIL_SIETE("2007"),DOSMIL_OCHO("2008"),DOSMIL_NUEVE("2009"),DOSMIL_DIEZ("2010"),DOSMIL_ONCE("2011"),
    DOSMIL_DOCE("2012"),DOSMIL_TRECE("2013"),DOSMIL_CATORCE("2014"),DOSMIL_QUINCE("2015"),DOSMIL_DIEZ_Y_SEIS("2016"),DOSMIL_DIEZ_Y_SIETE("2017"),DOSMIL_DIEZ_Y_OCHO("2018"),DOSMIL_DIEZ_Y_NUEVE("2019"),DOSMIL_VEINTE("2020");

    private String year;

    public String getYear() {
        return this.year;
    }

    private EnumModels(String year) {
        this.year = year;
    }

    public String toString() {
        return year;
    }

}

1 Ответ

0 голосов
/ 16 сентября 2018

Компоненты Swing не рисуются должным образом, когда вы используете прозрачные фоны, потому что Swing ожидает, что компонент будет непрозрачным или непрозрачным на основе свойства setOpaque (...) компонента.

Если вы хотите использовать прозрачность, то вы должны вручную убедиться, что фон закрашен кодом примерно так:

JPanel panel = new JPanel()
{
    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
};
panel.setOpaque(false); // background of parent will be painted first
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);

Вам потребуется настроить рисование для каждого компонента с использованием прозрачного фона.

Или более простой подход - использовать AlphaContainer, который действует как панель-обертка для компонента и закрашивает фон для вас. См. Фоны с прозрачностью для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...