2

我对这段代码有一个难题:

public class StatusAndPersonPanel implements ActionListener {

    private JPanel myPanel;
    private String[] status = {"Good", "Bad", "Not so bad"};
    private Color[] backgrounds = {Color.GREEN, Color.RED, Color.ORANGE};
    private JComboBox<String> box;

    public ComboboxConstructor() {
        myPanel = new JPanel();
        box = new JComboBox<String>(status);
        ComboBoxRenderer myBackgrounds = new ComboBoxRenderer(box);
        myBackgrounds.setColors(backgrounds);
        myBackgrounds.setStrings(status);

        box.setRenderer(myBackgrounds);
        box.addActionListener(this);

        Color selectedColor = (Color) backgrounds[box.getSelectedIndex()];
        box.setBackground(selectedColor);
        myPanel.add(box); // putting it into my panel
    }

    @Override
    public void actionPerformed(ActionEvent event) {

        Color selectedColor = (Color) backgrounds[box.getSelectedIndex()];
        box.setBackground(selectedColor);
    }
}

正如您在图像中看到的那样,在第 1 步中,所有颜色都按照我的意愿制作,但现在我点击“没那么糟糕”,然后JComboBox选择正确的折叠,但不会改变颜色(箭头会,我不知道为什么),直到我失去焦点(第 3 步,单击另一个 `JPanel 元素),颜色才正确给出。

现在,我知道这只是一个小小的美容问题,但它让我发疯了!我尝试使用ActionListenerItemListener(更改后)和FocusListener(失去和获得焦点),但结果始终与步骤 2 中所示相同。

图片

非常感谢您提前提供的帮助和想法!

4

2 回答 2

2

AJComboBox使用单个渲染器显示所有单元格。你可以改变你的颜色ListCellRenderer,如图所示CustomComboBoxDemo

附录:相关示例可在此问答中找到。

于 2012-11-19T02:06:06.547 回答
1

我找到了答案……我只需要写 box.transferFocusUpCycle(); 在 ActionPerformed 方法中

所以他失去了焦点,像第 2 步一样重新绘制选定的项目。无论如何,感谢您的建议!最好的安德里亚

于 2012-11-19T23:15:42.513 回答