簡體   English   中英

擴展Swing JComboBox以刪除不需要的邊框

[英]Extending Swing JComboBox to remove unwanted border

我花了最后幾個小時尋找解決方案或者至少是一個關於這個問題的體面指南,但一無所獲。

我正在為我的一個小GUI實現一個自定義的Swing外觀和感覺。 到目前為止,我一直在使用UIManager.put("key", values); 取得良好成功的方法,但在適當修改JComboBoxes時我遇到了困難。

使用這個列表我設法使我的jComboBox真正接近我想要的樣子:

修改了JComboBox

我有兩個問題,主要問題和次要問題:

  • 重大的

    在此輸入圖像描述

    我希望藍色邊框不見了。

  • 次要

    在此輸入圖像描述

    我真的很喜歡黑色邊框消失了。

顯然, UIDefaults沒有key與兩個邊界有任何關系:它們似乎在我正在修改的外觀(應該是Metal)中以某種方式硬編碼。 我使用手動擴展ComboBoxRenderer並設法得到這個:

package exec.laf.theme;

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


public class ComboBoxRenderer extends BasicComboBoxRenderer {
    private Color background;
    private Color selectionBackground;

    public ComboBoxRenderer() {
        super();

        background = UIManager.getColor("ComboBox.background");
        selectionBackground = UIManager.getColor("ComboBox.selectionBackground");
    }

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

        if (isSelected) setBackground(selectionBackground);
        else setBackground(background);

        return this;
    }
}

我每次創建一個JComboBox時都指定這個Renderer:

aComboBox.setRenderer(new ComboBoxRenderer());

獲得與非擴展JComboBox相同的外觀。

問題是,通過這個擴展,我找不到觸摸這些邊界的方法。 添加setBorder(new EmptyBorder(0, 0, 0, 0)); 什么都不做,因為它只是為列出的項添加了邊框。

我檢查了javax.swing.plaf.basic.BasicComboBoxRenderer的源代碼以查看是否在那里應用了任何邊框,但沒有找到任何內容(唯一的邊框是應用於列出項目的邊框,我可以覆蓋如上所示。

我應該做些什么? 我是在延長錯誤的課程,還是我錯過了其他的東西?

我找到的解決方案是:

UIManager.put("ComboBox.borderPaintsFocus", Boolean.TRUE)

這會在ComboBoxUI中設置一個布爾值,以防止渲染焦點邊框,焦點邊框是聚焦時圍繞所有按鈕繪制的邊框。 它的風格取決於你的外觀和感覺。

要刪除comboBox PopUp的黑色邊框,

Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup = (BasicComboPopup)child;
popup.setBorder(BorderFactory.createEmptyBorder());

如果我說得不夠,你的問題通常是如何使用BasicComboBoxRenderer中的擴展類。 所以這里有一個簡單的代碼來解釋你如何使用它:

public class RenderComboBox extends BasicComboBoxRenderer {

    Color selectedBackground;
    Color selectedForground;
    Color background;
    Color forground;

    public RenderComboBox() {
        setOpaque(true);        
        background = new Color(37, 37, 37);
        selectedBackground = new Color(93, 93, 93);
        forground = Color.WHITE;
        selectedForground = forground;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

        if (isSelected) {
            setBackground(selectedBackground);
            setForeground(selectedForground);
        } else {
            setBackground(background);
            setForeground(forground);
        }
        setFont(list.getFont());
        if (value == null) {
            setText("");
        } else {
            setText(value.toString());
        }
        return this;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(null);
        frame.setPreferredSize(new Dimension(200, 170));

        JComboBox<String> combobox = new JComboBox<>();
        combobox.setRenderer(new RenderComboBox());
        combobox.setBounds(50, 50, 100, 20);
        combobox.addItem("TEST");
        combobox.addItem("REVERT");

        frame.add(combobox);
        frame.pack();
        frame.setVisible(true);

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM