首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java具有3种状态的JCheckbox (完全选择、部分选择和取消选择)

Java具有3种状态的JCheckbox (完全选择、部分选择和取消选择)
EN

Stack Overflow用户
提问于 2010-04-23 20:32:05
回答 8查看 11.9K关注 0票数 10

我想要一个有3个状态的JCheckbox,如下所示:

  1. 部分选定
  2. 未选
  3. 全选

Q1。我是否可以将JCheckbox用于上述目的,或者必须使用一些自定义swing组件?

EN

回答 8

Stack Overflow用户

发布于 2010-04-23 20:39:58

下面是一个TristateCheckBox的示例:

http://www.javaspecialists.co.za/archive/Issue145.html

票数 5
EN

Stack Overflow用户

发布于 2010-04-23 20:40:16

哦,是的,但是您必须创建一个自定义组件。

看一看Java专家中的这篇文章,看看它是否适合您。

不过,它需要在OSX中做一些工作。

WinXP:

票数 5
EN

Stack Overflow用户

发布于 2014-11-05 04:08:19

我不知道为什么有人会给出附加图标png文件的解决方案,而java为覆盖paintIcon(.)提供了很大的乐趣。方法。

确定三状态CheckBox立场的最佳轻量级解决方案是IMO ClientProperty属性。

代码语言:javascript
复制
/*
 * Tri-state checkbox example
 * @s1w_
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


class TCheckBox extends JCheckBox implements Icon, ActionListener {

    final static boolean MIDasSELECTED = true;  //consider mid-state as selected ?


    public TCheckBox() { this(""); }

    public TCheckBox(String text) {
        super(text);
        putClientProperty("SelectionState", 0);
        setIcon(this);
        addActionListener(this);
    }

    public TCheckBox(String text, int sel) {
        /* tri-state checkbox has 3 selection states:
         * 0 unselected
         * 1 mid-state selection
         * 2 fully selected
        */
        super(text, sel > 1 ? true : false);

        switch (sel) {
            case 2: setSelected(true);
            case 1:
            case 0:
                putClientProperty("SelectionState", sel);
                break;
           default:
                throw new IllegalArgumentException();
        }
        addActionListener(this);
        setIcon(this);
    }

    @Override
    public boolean isSelected() {
        if (MIDasSELECTED && (getSelectionState() > 0)) return true;
        else return super.isSelected();
    }

    public int getSelectionState() {
        return (getClientProperty("SelectionState") != null ? (int)getClientProperty("SelectionState") :
                                         super.isSelected() ? 2 :
                                         0);
    }

    public void setSelectionState(int sel) {
        switch (sel) {
            case 2: setSelected(true);
                    break;
            case 1: 
            case 0: setSelected(false);
                    break;
           default: throw new IllegalArgumentException();
        }
        putClientProperty("SelectionState", sel);
    }


    final static Icon icon = UIManager.getIcon("CheckBox.icon");

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        icon.paintIcon(c, g, x, y);
        if (getSelectionState() != 1) return;

        int w = getIconWidth();
        int h = getIconHeight();
        g.setColor(c.isEnabled() ? new Color(51, 51, 51) : new Color(122, 138, 153));
        g.fillRect(x+4, y+4, w-8, h-8);

        if (!c.isEnabled()) return;
        g.setColor(new Color(81, 81, 81));
        g.drawRect(x+4, y+4, w-9, h-9);
    }

    @Override
    public int getIconWidth() {
        return icon.getIconWidth();
    }

    @Override
    public int getIconHeight() {
        return icon.getIconHeight();
    }

    public void actionPerformed(ActionEvent e) {
        TCheckBox tcb = (TCheckBox)e.getSource();
        if (tcb.getSelectionState() == 0)
            tcb.setSelected(false);

        tcb.putClientProperty("SelectionState", tcb.getSelectionState() == 2 ? 0 : 
                                                     tcb.getSelectionState() + 1);

        // test
        System.out.println(">>>>IS SELECTED: "+tcb.isSelected());
        System.out.println(">>>>IN MID STATE: "+(tcb.getSelectionState()==1));
    }
}

用法:TCheckBox tcb = new TCheckBox("My CheckBox");

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2701817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档