"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JTable 그룹에 라디오 버튼을 추가할 때 독점성을 달성하는 방법은 무엇입니까?

JTable 그룹에 라디오 버튼을 추가할 때 독점성을 달성하는 방법은 무엇입니까?

2024년 11월 22일에 게시됨
검색:342

How to Achieve Exclusivity When Adding Radio Buttons to JTable Groups?

JTable의 그룹에 라디오 버튼 추가

문제 설명

렌더러와 편집기를 사용하여 JTable에 라디오 버튼을 추가하려고 하면 다음이 발생했습니다. 독점성을 달성할 수 없음. 제공된 코드 조각은 문제를 보여줍니다.

대체 솔루션

대안으로 JComboBox를 행 내에서 상호 배타적인 선택 항목에 대한 편집기로 사용하는 것을 고려해 보십시오. 이는 공간 관리 및 사용자 경험을 위한 보다 효율적인 접근 방식입니다.

코드 예시

// ...
// Import declarations
// ...

public class JRadioAsRendererEditor extends JPanel {

    // ...
    // Class variables and methods
    // ...

    private class StatusRenderer extends StatusPanel implements TableCellRenderer {

        // ...
        // Overridden methods
        // ...

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
            setStatus((Status) value);
            if (isSelected) {
                setBackground(table.getSelectionBackground());
            } else {
                setBackground(table.getBackground());
            }
            return this;
        }
    }
}

추가 대안

1. 대체 렌더러 및 편집기

원하는 동작을 달성하기 위해 자신만의 사용자 정의 렌더러 및 편집기 클래스를 만들 수 있습니다. 예는 다음과 같습니다.

public class RadioCellRenderer extends DefaultTableCellRenderer {

    private RadioButtonGroup group;

    public RadioCellRenderer(RadioButtonGroup group) {
        this.group = group;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
        JRadioButton button = (JRadioButton) value;
        button.setSelected(group.isSelected(button));
        return button;
    }
}

public class RadioCellEditor extends DefaultCellEditor {

    private RadioButtonGroup group;

    public RadioCellEditor(JRadioButtonCheckBox box, RadioButtonGroup group) {
        super(box);
        this.group = group;
    }

    @Override
    public Object getCellEditorValue() {
        return delegate.get();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {
        JRadioButton button = (JRadioButton) value;
        if (group.isClearable()) {
            group.clearSelection();
        }
        group.add(button);
        return button;
    }
}

2. DefaultTableCellRenderer 및 DefaultCellEditor

독점성을 처리하는 사용자 정의 JRadioButton과 함께 DefaultTableCellRenderer 및 DefaultCellEditor 클래스를 사용할 수 있습니다. 예는 다음과 같습니다.

public class ExclusiveJRadioButton extends JRadioButton {

    private RadioButtonGroup group;

    public ExclusiveJRadioButton(RadioButtonGroup group) {
        this.group = group;
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                group.setSelected(ExclusiveJRadioButton.this, true);
            }
        });
    }

    @Override
    public void setSelected(boolean selected) {
        if (group.isSelected(this)) {
            return;
        }
        super.setSelected(selected);
    }
}
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3