为什么我不能编辑这个可编辑jcombobox的外观?

bd1hkmkf  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(342)

我有这段代码,mycomboxRenderer()似乎无法使用它。它在下面的注解行中有一个错误。
此代码用于自动建议。因此,当用户在textfield上键入时,它会在一个组合框中显示建议。

public test2() {
    initComponents();

     jComboBox1.setRenderer(new MyComboBoxRenderer1());
     jComboBox1.setBackground(new Color(0,0,0,0));

    final JTextField textfield = (JTextField)     jComboBox1.getEditor().getEditorComponent(); //it has error in this line
    textfield.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent ke) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                comboFilter(textfield.getText());
            }
        });
    }
    });
    }

可能和文本域有关。我的问题是我想编辑combobox的外观或设计。我希望它继承帧的背景。像透明的。示例如图所示。
这是照片。请点击下面的链接查看。
应该是这样的
而不是这个。这是上述代码的输出。
下面是我的组合框渲染器中的代码。

public MyComboBoxRenderer1(){
    setOpaque(true);
    setFont(new Font ("Segoe UI Semibold", Font.PLAIN ,14));
    setForeground(Color.WHITE);
}

@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    setText(value.toString());
   if (isSelected)
    {
      setBackground(Color.WHITE);
      setForeground(Color.BLACK);
    }
    else {
        setBackground(Color.GRAY);
        setForeground(Color.WHITE);
    }

    return this;
}
}

为什么渲染器不能处理这个?我该怎么做才能让它成功呢?有人能帮我吗?提前谢谢。:)
已编辑。。。
我已经把背景设置成透明的了。我只需要声明texfield的背景。是的。textfield.setbackground(新颜色(0,0,0,0));setforeground(新颜色(255255));
但它留下的一小部分仍然是不透明的。
我试着在我的框架上做一个额外的组合框。但它没有文本字段。而且效果很好!

上面是文本框的组合框,我有问题。下面是一个w/o textfield,我刚刚试过,如果代码将与一个正常的组合框工作。我要让它看起来像下面的那个。

jComboBox1.setRenderer(new MyComboBoxRenderer1());
     jComboBox1.setBackground(new Color(0,0,0,0)); 

     jComboBox2.setRenderer(new MyComboBoxRenderer1());
     jComboBox2.setBackground(new Color(0,0,0,0));

它有相同的代码。但另一个不行。也许又是因为文本域??:(((

gajydyqb

gajydyqb1#

jComboBox1.setBackground(new Color(0,0,0,0));

不要尝试使用透明的颜色。swing不知道如何正确地绘制透明的颜色。有关详细信息,请参见:透明背景。
而是更改组件的不透明性:

component.setOpaque( false );

对于组合框,您需要考虑组件和渲染器,因此可以使用:

comboBox.setOpaque(false);
((JLabel)comboBox.getRenderer()).setOpaque(false);

但是,这将导致下拉列表出现问题。因为渲染现在是透明的,所以您将看不到行选择。
我还没有测试过这个,但是一个可能的解决方案,如果改变不透明的渲染器的基础上的项目被渲染。
代码可能是:

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

    setOpaque(index == -1 ? false : true);

    // add custom painting here

    return this;
}

-1表示组合框中的项与列表中的项相对。

相关问题