【问题标题】:Extending Swing JComboBox to remove unwanted border扩展 Swing JComboBox 以删除不需要的边框
【发布时间】:2015-02-25 03:22:40
【问题描述】:

我在过去的几个小时里一直在寻找解决方案,或者至少是一个关于这个问题的体面指南,但什么也没找到。

我正在为我的一个小型 GUI 实现自定义 Swing 外观。到目前为止,我一直在使用UIManager.put("key", values); 方法取得了很好的成功,但是在正确修改 JComboBoxes 时我被卡住了。

使用 this list 我设法让我的 jComboBoxes 非常接近我想要的样子:

我有两个问题,一个主要的和一个次要的:

  • 专业

    我希望蓝色边框消失。

  • 次要

    我真的希望黑色边框消失。

显然UIDefaults 中的key 与这两个边界没有任何关系:它们似乎以某种方式硬编码在我正在修改的外观(应该是金属)中。我求助于手动扩展 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 时,我都会指定此渲染器,如下所示:

aComboBox.setRenderer(new ComboBoxRenderer());

获得与非扩展 JComboBox 相同的外观。

问题在于,有了这个扩展,我找不到触及这些边界的方法。添加setBorder(new EmptyBorder(0, 0, 0, 0)); 没有任何作用,因为它只是为列出的项目添加了一个边框。

我检查了javax.swing.plaf.basic.BasicComboBoxRenderer 的源代码,看看那里是否应用了任何边框,但什么也没找到(唯一的边框是应用于列出的项目的那个,我可以如上所示覆盖它。

我该怎么办?我是扩展了错误的课程,还是我错过了其他东西?

【问题讨论】:

  • 实现您自己的外观和感觉委托。 Modifying the Look and Feel
  • @MadProgrammer 我似乎找不到任何关于在该链接中实际修改 LaF 的信息,它似乎集中在将现有的应用到 GUI 上。
  • 查看jdk中的src.jar,看看Java自带的实现
  • BasicComboBoxEditor 中的边框应该是null,但是子类可以做其他事情。
  • @trashgod 我也尝试扩展编辑器,但一无所获。

标签: java swing jcombobox


【解决方案1】:

我找到的解决办法是:

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

这会在 ComboBoxUI 内设置一个布尔值,以防止呈现焦点边框,这是在所有按钮获得焦点时绘制在所有按钮周围的边框。它的风格取决于您的外观和感觉。

【讨论】:

    【解决方案2】:

    去除comboBox PopUp的黑边,

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

    【讨论】:

      【解决方案3】:

      如果我理解,您的问题通常是如何使用 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);
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 2016-12-19
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多