【问题标题】:Making JComboBox transparent使 JComboBox 透明
【发布时间】:2012-12-06 00:36:45
【问题描述】:

我在使 JComboBox 透明时遇到问题。我尝试将 opaque 设置为 false 和背景 0 的 alpha,但它不起作用。我想我需要更改一些进行渲染或类似操作的类。这是代码..

  import java.awt.EventQueue;
  import java.awt.Graphics;
  import java.awt.Rectangle;

  import javax.swing.JFrame;
  import javax.swing.JComboBox;
  import javax.swing.JTextField;
  import javax.swing.plaf.basic.BasicComboBoxUI;

  import java.awt.Color;


public class App {

private JFrame frame;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                App window = new App();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public App() {
    initialize();
}

private void initialize() {
    frame = new JFrame();
    frame.getContentPane().setBackground(Color.GREEN);
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
    JComboBox comboBox = new JComboBox(petStrings);
    comboBox.setBounds(149, 99, 155, 20);
    comboBox.setOpaque(false);
    //comboBox.setBackground(new Color(0,0,0,0));
    ((JTextField)comboBox.getEditor().getEditorComponent()).setOpaque(false);
    comboBox.setUI(new BasicComboBoxUI(){  

        public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus){}});  
    frame.getContentPane().add(comboBox);

}

}

【问题讨论】:

  • 你能告诉我们你的问题在哪里吗,为了更好的帮助,尽快发布SSCCE,简短,可运行,可编译,仅关于 JFrame 和 JComboBox
  • 看看这个post
  • @bonCodigo - 你提到的帖子是关于创建形状和半透明的窗口。不要认为它适用于 JComboBox。
  • @user1776749 我忘了添加“查看这篇文章以获得想法”。等着看答案!
  • 你提到的帖子是关于创建形状和半透明的窗口。不要认为它适用于 JComboBox。

标签: java swing jcombobox


【解决方案1】:
JComboBox myComboBox = new JComboBox(array);
myComboBox .setOpaque(false);
myComboBox .setEditable(true);
JTextField boxField = (JTextField)myComboBox .getEditor().getEditorComponent();
boxField.setBorder(BorderFactory.createEmptyBorder());
boxField.setBackground(new Color(0, 0, 0, 0));
boxField.setFocusable(false);

答案在http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6687960

【讨论】:

    【解决方案2】:

    试试这个。

    yourComboBox.setOpaque(false);
    ((JTextField)yourComboBox.getEditor().getEditorComponent()).setOpaque(false);
    
    setUI(new BasicComboBoxUI() {
    
       @Override    
       public void paintCurrentValueBackground(
           Graphics g, Rectangle bounds, boolean hasFocus) {
    
       }
    });
    

    【讨论】:

    • setUI 方法只是去掉了边界并改变了 LAF——至少对我来说是这样。
    【解决方案3】:

    假设您只希望 ComboBox 的文本字段透明(而不是弹出窗口),使用以下代码应该可以工作。您需要弄乱 ComboBox 渲染器而不是编辑器。如果您可以在 ComboBox 中键入,则使用编辑器;如果 ComboBox 只是一个值列表,则使用渲染器。

    comboBox.setOpaque(false);
    comboBox.setRenderer(new DefaultListCellRenderer(){
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            JComponent result = (JComponent)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            result.setOpaque(false);
            return result;
        }});
    

    【讨论】:

    • 要了解为什么 setOpaque 技巧不适用于 Nimbus L&F,请参阅:stackoverflow.com/questions/2451990/setopaquetrue-false-java
    • 如何去除边框?我试过 comboBox.setBorder(null);和 comboBox.setBorder(new EmptyBorder(0, 0, 0, 0));但它不起作用。
    • 该解决方案不适用于 Windows 样式的 JComboBox、UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());!
    • @user1610362 是的 - 不同的 L&F 会改变它的工作方式(因为您正在尝试编辑 L&F)。您需要它同时在 Metal 和 Windows 中工作吗?还是只是窗户?根据您的具体情况修改您的问题将有助于...
    • 仅在 Windows 上,我需要删除边框。也只有 ComboBox 的文本字段而不是弹出窗口。
    【解决方案4】:

    你需要预设这几件事

    jcombo.setOpaque(false);
    jcombo.setContentAreaFilled(false);
    jcombo.setBorderPainted(false);
    

    【讨论】:

    • JComboBox 是否也可以使用 setContentAreaFilled()?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多