【问题标题】:Transparency failure in swing components摆动组件的透明度故障
【发布时间】:2018-09-16 17:21:26
【问题描述】:

我一直在使用 Color(p,p,p,p) 处理 JCombobox 的透明度问题。一旦我点击它,当光标只在其中一个上时,显示的所有选项似乎都被光标选中了。有时其他按钮出现在透明组件后面,但它们不在它后面。

透明度确实有效,但我不希望它看起来有问题,我一直在尝试将 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;
    }

}

【问题讨论】:

  • 欢迎来到 StackOverflow!为了帮助其他人更好地回答您的问题,请考虑创建一个 mcve,其中仅包含查看问题所需的内容。
  • 仍然无法编译!操作是否与问题相关?控制器是否相关? MyButtons 是否相关?枚举是否相关(您可以添加字符串)。边框或字体是否与问题相关?你的问题是关于一个组合框!创建一个新项目,其中包含一个框架和一个组合框来演示该问题。如果你不能简化问题,那么你就不明白你在问什么。我们不想看到您的应用程序,只想看到演示问题的最简单的代码。整个类大概有 20 行代码。

标签: java swing transparency jcombobox


【解决方案1】:

当您使用透明背景时,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,它充当组件的包装面板并为您绘制背景。请参阅Backgrounds With Transparency 了解更多信息。

【讨论】:

  • 是的,你说得对,我已经在组件 JComboBox 上做到了这一点。我创建了 MyComboBoxClass 并将其设置为paintComponent(),然后它停止被窃听。但是显示的项目仍然有问题,就像你发给我的链接一样,这正是错误,无论如何都要将该组件设置为 de JComboBox,就像我在这里尝试的那样:((JLabel)modelsBox.getRenderer()).setForeground (红色);我的意思是,创建 MyLabel,将它设置为 paintComponent() 和不透明的 false,然后将其添加到 JComboBox,而不是它的默认 JLabel,它显示它的项目..?
  • 可能是因为组合弹出窗口使用透明背景显示在另一个组件上。您需要使用透明度为所有组件进行自定义绘画。你还没有发布minimal reproducible example,所以我不能提供进一步的建议。您的问题是关于框架和组合框的,因此请创建一个示例,其中仅包含那些证明问题的组件,并展示您如何实施此处给出的建议。
  • 我已经编辑过了,有一个combobox项目透明失败的例子,你可以运行它看看它的样子,对不起,我对iu编程有点假
  • you can run - 不,我不能,因为代码无法编译。您有与问题无关的代码。删除代码并确保代码编译。您所需要的只是展示问题的框架和组合框。所有其他组件都与问题无关,我没有时间查看所有代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2013-08-06
  • 2013-06-05
  • 2012-06-20
相关资源
最近更新 更多