티스토리 뷰

3 상태 체크박스는 위키에 따르면 일반적인 2개의 상태를 가지는 체크박스에 indeterminate 상태가 추가돼 3개의 상태를 같는 체크 박스를 말합니다.

- https://en.wikipedia.org/wiki/Checkbox

 

이런 3 상태 체크박스는 컴퓨터 사용 중 주로 파일을 선택하는 Tree에서 볼 수 있는데, 파일 선택 트리는 아니지만 비슷한 이미지로 아래와 같은 트리가 있습니다. 자바의 스윙에선 자체적으로 3 상태 체크박스는 지원하지 않아 3상태 체크박스를 직접 만들어 사용하던지 다른 분들이 제공하는 라이브러리를 가져와 사용해야합니다.

이미지 출처 - https://stackoverflow.com/questions/31918913/checkbox-indeterminate-state-for-richfaces-tree

그래서 다음의 이미지 파일을 사용해서 3 상태 체크박스를 Swing으로 구현해봤습니다.

public class TSCheckBox extends JCheckBox {
    private boolean isIndet = false;
    private Icon indeterminate;
    private Icon checked;
    private Icon unchecked;
    
    public TSCheckBox(String s) {
        super(s);
        indeterminate = new ImageIcon(TSCheckBox.class.getResource("indeterminate.png"));
        unchecked = new ImageIcon(TSCheckBox.class.getResource("unchecked.png"));
        checked = new ImageIcon(TSCheckBox.class.getResource("checked.png"));
    }
    
    @Override
    public void paint(Graphics g) {
        if (isSelected())
            isIndet = false;
        setIcon(isIndet ? indeterminate : isSelected() ? checked : unchecked );
        super.paint(g);
    }
    
    public void setIndet(boolean value) {
        isIndet = value;
        if (isIndet)
            setSelected(false);
        repaint();
    }
    
    public boolean isIndet() {
        return isIndet;
    }
}
cs

아래는 테스트 해본 코드와 실행 화면입니다.

public class Test extends JFrame {
 
    public static void main(String[] args) {
        Test frame = new Test();
    }
    
    public Test() {
        ProjectGUI.apply();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100100450300);
        getContentPane().setLayout(null);
 
        TSCheckBox cheackbox = new TSCheckBox("TEST");
        cheackbox.setBounds(82511523);
        cheackbox.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(e.getButton() == 3)
                    cheackbox.setIndet(!cheackbox.isIndet());
                super.mousePressed(e);
            }
        });
        getContentPane().add(cheackbox);
 
        setVisible(true);
    }
}
cs


'Java > Swing' 카테고리의 다른 글

반투명 프레임 JFrame  (0) 2017.01.06
자동 글자 크기 조절 JLabel  (2) 2016.09.27
JFrame 화면 가운데 배치하기 (Java/Swing)  (1) 2016.09.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday