如何在Swing中制作只读JCheckBox?

时间:2013-12-12 23:29:20

标签: java swing checkbox

我希望有一列复选框表示持久程序的步骤。

在这种情况下,用户不应更改复选框。它们由后台流程改变。

不幸的是,如果我打电话给setEnable(false),我的复选框不仅是只读的,而且还会变暗。

如何完成?

3 个答案:

答案 0 :(得分:3)

如果您使用的是Java7或swingX(JXLayer),则可以使用JLayer类。

快速举例:

import java.awt.AWTEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.plaf.LayerUI;

public class JCheckBoxUnselectable {


    public static void main(String args []){
        JFrame frame = new JFrame();
        frame.setTitle("Test checkbox");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.add(new JLabel("Test checkbox"));
        JCheckBox checkbox = new JCheckBox();
        LayerUI<JComponent> layerUI = new MyLayerUISubclass();
        JLayer<JComponent> jlayer = new JLayer<>(checkbox, layerUI);

        panel.add (jlayer);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

    }



    static class MyLayerUISubclass extends LayerUI<JComponent>{


        @Override
        public void installUI(JComponent c) {
            super.installUI(c);
            JLayer jlayer = (JLayer)c;
            jlayer.setLayerEventMask(
                    AWTEvent.MOUSE_EVENT_MASK |
                    AWTEvent.KEY_EVENT_MASK 
                    );

        }

        @Override
        public void uninstallUI(JComponent c) {
            JLayer jlayer = (JLayer)c;
            jlayer.setLayerEventMask(0);
            super.uninstallUI(c);
        }


        @Override
        protected void processMouseEvent(MouseEvent e, JLayer l) {
            e.consume();
        }





        @Override
        protected void processKeyEvent(KeyEvent e,
                JLayer<? extends JComponent> l) {
            e.consume();
        }



    }
}

了解详情:How to decorate components with JLayer

答案 1 :(得分:3)

从复选框中删除MouseListener和Key Bindings。

MouseListener[] ml = (MouseListener[])checkBox.getListeners(MouseListener.class);

for (int i = 0; i < ml.length; i++)
    checkBox.removeMouseListener( ml[i] );

InputMap im = checkBox.getInputMap();
im.put(KeyStroke.getKeyStroke("SPACE"), "none");
im.put(KeyStroke.getKeyStroke("released SPACE"), "none");

答案 2 :(得分:2)

这看起来有点奇怪,但是会提出如何更新状态的问题,但是,基本上,您希望将ButtonModel替换为selected状态不可能的checkBox = new JCheckBox(); checkBox.setModel(new DefaultButtonModel() { @Override public boolean isSelected() { return true; } @Override public void setSelected(boolean b) { // Stop events from being raised... } }); 改变。

例如......

{{1}}

现在,您可能还希望使复选框无法对焦,以防止它接收键盘焦点。

说了这么多,作为一个用户,我会发现这非常令人沮丧,因为复选框“显示”可编辑