установка включенной радиокнопки по умолчанию в JTable

Я использовал это руководство, чтобы создать JTable, который будет обрабатывать радио кнопки. Работает нормально, за исключением того, что мне нужно включить кнопку по умолчанию.

может быть n строк. Я попытался включить его через модель таблицы по умолчанию, Object[][], таблицу, и я попытался включить кнопку, прежде чем добавлять ее в Object[][]. Я не мог понять, как (если это возможно) сделать это с группой кнопок.

чтобы найти кнопку, включенную по умолчанию, я должен сравнить текст кнопки со строкой (эта часть работает).


person Phox    schedule 22.08.2012    source источник
comment
никогда не храните компоненты в tableModel, это совершенно неправильно... Вместо этого храните данные, которые могут быть отображены с помощью пользовательского компонента рендеринга   -  person kleopatra    schedule 23.08.2012


Ответы (2)


Не уверен, что правильно интерпретирую вопрос. Вы можете использовать конструктор JRadioButton для установки выбора, например, фрагмент (на основе примера кода OP) установит выбранную кнопку «B»:

dm.setDataVector(new Object[][] { { "Group 1", new JRadioButton("A") },
    { "Group 1", new JRadioButton("B", true) },
    { "Group 1", new JRadioButton("C") },
    { "Group 2", new JRadioButton("a") },
    { "Group 2", new JRadioButton("b") } }, new Object[] {
    "String", "JRadioButton" });

Вы также можете изменить выбор следующим образом:

((JRadioButton) dm.getValueAt(0, 1)).setSelected(true);

Вы также можете использовать метод ButtonGroup.setSelected().

EDIT: удалить компоненты из модели

Модель должна содержать данные, а не компоненты. Хранение компонентов в модели противоречит идее визуализаторов и редакторов. Дополнительные сведения см. в разделе редакторы и средства визуализации и Модели Swing и визуализаторы. Посмотрите на следующий пример поведения группы кнопок имитации в модели:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.table.*;

public class ButtonGroupMockupTest {
    private static void createAndShowGUI() {
        DefaultTableModel model = new DefaultTableModel(new Object[][] {
                { "Group 1", Boolean.FALSE }, { "Group 2", Boolean.FALSE },
                { "Group 3", Boolean.FALSE } },
                new Object[] { "Name", "State" }) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int col) {
                if (col == 1)
                    return Boolean.class;
                return super.getColumnClass(col);
            }

            @Override
            public void setValueAt(Object value, int row, int col) {
                super.setValueAt(value, row, col);
                if (col == 1 && value.equals(Boolean.TRUE))
                    deselectValues(row, col);
            }

            private void deselectValues(int selectedRow, int col) {
                for (int row = 0; row < getRowCount(); row++) {
                    if (getValueAt(row, col).equals(Boolean.TRUE)
                            && row != selectedRow) {
                        setValueAt(Boolean.FALSE, row, col);
                        fireTableCellUpdated(row, col);
                    }
                }
            }
        };

        JTable table = new JTable(model);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setDefaultRenderer(Boolean.class, new BooleanRadionRenderer());
        table.setDefaultEditor(Boolean.class, new BooleanRadioEditor());

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JScrollPane(table));

        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    static class BooleanRadionRenderer implements TableCellRenderer, UIResource {
        JRadioButton radioButton;
        Border emptyBorder;

        public BooleanRadionRenderer() {
            radioButton = new JRadioButton();
            radioButton.setHorizontalAlignment(JRadioButton.CENTER);
            radioButton.setBorderPainted(true);
            emptyBorder = BorderFactory.createEmptyBorder(1, 1, 1, 1);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int col) {
            if (isSelected) {
                radioButton.setBackground(table.getSelectionBackground());
                radioButton.setForeground(table.getSelectionForeground());
            } else {
                radioButton.setBackground(table.getBackground());
                radioButton.setForeground(table.getForeground());
            }
            if (hasFocus)
                radioButton.setBorder(UIManager
                        .getBorder("Table.focusCellHighlightBorder"));
            else
                radioButton.setBorder(emptyBorder);

            radioButton.setSelected(((Boolean) value).booleanValue());
            return radioButton;
        }
    }

    static class BooleanRadioEditor extends AbstractCellEditor 
                                    implements TableCellEditor {
        private static final long serialVersionUID = 1L;
        private JRadioButton radioButton;

        public BooleanRadioEditor() {
            radioButton = new JRadioButton();
            radioButton.setHorizontalAlignment(JRadioButton.CENTER);
            radioButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // prevent deselection to mimic button group
                    if (!radioButton.isSelected())
                        cancelCellEditing();
                    stopCellEditing();
                }
            });
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int col) {
            radioButton.setSelected(((Boolean) value).booleanValue());
            return radioButton;
        }

        @Override
        public Object getCellEditorValue() {
            return Boolean.valueOf(radioButton.isSelected());
        }
    }   
}
person tenorsax    schedule 22.08.2012
comment
О боже, я идиот! Я использовал setEnabled вместо setSelected... Работа с java gui в течение полутора недель изжарила мне мозг. - person Phox; 22.08.2012
comment
-1 для хранения компонентов в модели (OP, копирующий старый, неверный пример, не является оправданием для его повторения ;-) - person kleopatra; 23.08.2012
comment
@kleopatra согласен! Я дополнил ответ примером групповой реализации в модели. - person tenorsax; 24.08.2012
comment
@Phox, пожалуйста, ознакомьтесь с моим последним обновлением, которое исключает компоненты из модели. - person tenorsax; 24.08.2012
comment
Я планирую вернуться к коду и очистить его. Поэтому я попытаюсь исправить переключатели, чтобы использовать данные, а не компоненты. - person Phox; 24.08.2012

Вы пытались перекрасить () свой JTable?

Всегда ли флажок снят или есть случаи, когда это не так?

Hovercraft Full Of Eels прав: не могли бы вы опубликовать свой код?

person Benj    schedule 22.08.2012
comment
Оказывается, я сильно напортачил и использовал setEnabled вместо setSelected. Это был полный бред с моей стороны. - person Phox; 22.08.2012
comment
:p нет проблем, мы все иногда делаем это! - person Benj; 22.08.2012
comment
Я тоже ошибался, решение repaint() работало для моего проекта, где я создавал кнопки с картинками, но (какой идиот) вы находитесь в совершенно другом случае! - person Benj; 23.08.2012
comment
с моделью с хорошим поведением (читай: правильно уведомляющей) перерисовка никогда не требуется. Если это, кажется, решает проблемы с обновлением, что-то не так в другом месте - person kleopatra; 23.08.2012