【问题标题】:How can i get rid of the blue highlight inside JCombobox?我怎样才能摆脱 JCombobox 内的蓝色突出显示?
【发布时间】:2020-09-14 16:00:31
【问题描述】:

JCombobox 的“内容”窗口有这个蓝色突出显示,我不知道如何摆脱,请帮助。

这是一个问题的例子:

package example;

import java.awt.CardLayout;
import java.awt.Color;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(1);
        frame.setSize(500, 500);
        frame.setLayout(new CardLayout());
        frame.setVisible(true);
        
        JPanel panel=new JPanel();
        panel.setLayout(null);
        frame.add(panel);

        String[] model = {"pres.", "PPS.", "P. inp.", "P. mais q."};

        JComboBox combox;
        combox = new JComboBox(model);
        combox.setBounds(100, 100, 145, 30);
        combox.setBackground(new Color(215, 211, 165));
        combox.setFocusable(false);
        panel.add(combox);
        
        panel.updateUI();
    }

}

【问题讨论】:

  • Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。

标签: java swing jcombobox


【解决方案1】:

组合框是一个复杂的组件,内部使用了多个组件。 UI 决定了组件之间的交互方式。

例如,将您的代码更改为以下内容:

JComboBox combox;
combox = new JComboBox(model);
combox.setBorder( new LineBorder(Color.YELLOW) );
BasicComboBoxRenderer renderer = new BasicComboBoxRenderer();
renderer.setBorder( new LineBorder(Color.RED) );
combox.setRenderer(renderer);

您会注意到蓝色高亮不是组合框的边框或其渲染,这意味着我们无权访问另一个内部容器。

如果你真的想解决问题,那么你将需要自定义MetalComboBoxUI 类,这绝非易事,因为许多绘制方法都是私有的。但是看看类的代码,看看能不能做到。

您的代码的其他问题:

  1. 不要使用updateUI()。当 LAF 更改时,该方法在 Swing 内部调用。你没有改变 LAF

  2. 应在框架可见之前将组件添加到框架中。这将消除对 updateUI() 的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2021-01-27
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多