JComboBox中的中心项除了在禁用时清楚地显示文本

时间:2015-08-06 15:08:39

标签: java swing jcombobox

我正在使用

let base64Encoded = "YW55IGNhcm5hbCBwbGVhc3VyZS4=" let decodedData = Data(base64Encoded: base64Encoded)! let decodedString = String(data: decodedData, encoding: .utf8)! print(decodedString) println(decodedString)

((JLabel)comboBox.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER);中的文字项目居中。

但我也希望在JComboBox被禁用时(即文本外观不应/几乎没有变化),文本会清晰显示。

通过解决方案是使用ComboBox(请参阅下面的详细信息),当我使用comboBox.setEditable(true)时效果很好,除了它将文本对齐到左边。似乎解决这个问题需要做很多工作。

我想知道是否有人可以建议另一种方式在禁用的comboBox.setVisible(false)中清楚地显示文字?

非常感谢。

修改:我用于改进禁用文字显示的完整代码是

comboBox

编辑2

以下是一个完整的例子:

        ComboBoxEditor editor = comboBox.getEditor();
        JTextField etf = (JTextField) editor.getEditorComponent();
        etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
        etf.setBackground(UIManager.getColor("ComboBox.background"));
        comboBox.setEnabled(false);
        comboBox.setEditable(true);

编辑3 :它现在正在工作,但文本稍微向上移动,单击按钮时将删除comboBox边框。有办法防止这种情况吗?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class GUITest extends JPanel {

    static JFrame frame;
    static JButton changeButton;
    static JComboBox exampleComboBox;

    public GUITest() {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        String[] examples = {
            "abcd",
            "efgh",
            "ij"
        };

        exampleComboBox = new JComboBox(examples);

        // centre text of items in combo box
        ((JLabel) exampleComboBox.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER);

        JLabel buttonLabel = new JLabel("Click to make combo box disabled but text show clearly",
                JLabel.LEADING); //== LEFT

        JPanel patternPanel = new JPanel();
        patternPanel.setLayout(new BoxLayout(patternPanel,
                BoxLayout.PAGE_AXIS));

        exampleComboBox.setAlignmentX(Component.LEFT_ALIGNMENT);
        patternPanel.add(exampleComboBox);

        JPanel resultPanel = new JPanel(new GridLayout(0, 1));
        resultPanel.add(buttonLabel);
        changeButton = new JButton();
        resultPanel.add(changeButton);
        addButtonListener();

        patternPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        resultPanel.setAlignmentX(Component.LEFT_ALIGNMENT);

        add(patternPanel);
        add(Box.createRigidArea(new Dimension(0, 10)));
        add(resultPanel);

        setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

    } //constructor

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("ComboBoxDemo2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new GUITest();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    private static void addButtonListener() {
        changeButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ComboBoxEditor editor = exampleComboBox.getEditor();
                JTextField etf = (JTextField) editor.getEditorComponent();
                etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
                etf.setBackground(UIManager.getColor("ComboBox.background"));
                exampleComboBox.setEnabled(false);
                exampleComboBox.setEditable(true);
            }
        });
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

禁用组合框时无需使用编辑器。只需禁用组合框即可。所以ActionListener中的代码是:

changeButton.addActionListener(new ActionListener() 
{
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        exampleComboBox.setEnabled(false);
        //exampleComboBox.setEditable(true);
    }
});

然后在课程的顶部你可以使用:

UIManager.put("ComboBox.disabledForeground", Color.BLACK);

查看禁用组合框使用的前景色。禁用组合框时,不显示编辑器,因此正常渲染完成。

因此,您不需要使用JTextPane作为编辑器。