Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

JAVA, JRadioButton in JTable.

215  
irena17 местный житель28.12.06 11:59
NEW 28.12.06 11:59 
Необходимо сделатъ похожую таблицу с RadioButtons na JAVA.

Проблема в том, что в любой момент времени, при считывании выделенных RadioButtons, получаю все, кроме последней нажатой.
Помогите пожалуйста, любые размышления на данную тему приму с благодарностъю. Спасибо заранее.
Код выглядит так:
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class JRadioButtonTableExample2 extends JFrame {
public JRadioButtonTableExample2() {
super("JRadioButtonTable Example");
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(new Object[][] { { "1", new Integer(-1) },
{ "2", new Integer(-1) }, { "3", new Integer(0) },
{ "4", new Integer(1) }, { "5", new Integer(2) } },
new Object[] { "Question", "Answer" });
JTable table = new JTable(dm);
String[] answer = { "A", "B", "C" };
table.getColumn("Answer").setCellRenderer(
new RadioButtonRenderer(answer));
table.getColumn("Answer").setCellEditor(
new RadioButtonEditor(new JCheckBox(), new RadioButtonPanel(
answer)));
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll);
}
// Cell base
class RadioButtonPanel extends JPanel {
JRadioButton[] buttons;
RadioButtonPanel(String[] str) {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
buttons = new JRadioButton[str.length];
for (int i = 0; i < buttons.length; i++) {
buttons = new JRadioButton(str);
buttons.setFocusPainted(false);
add(buttons);
}
}
public void setSelectedIndex(int index) {
for (int i = 0; i < buttons.length; i++) {
buttons.setSelected(i == index);
}
}
public int getSelectedIndex() {
for (int i = 0; i < buttons.length; i++) {
if (buttons.isSelected()) {
return i;
}
}
return -1;
}
public JRadioButton[] getButtons() {
return buttons;
}
}
class RadioButtonRenderer extends RadioButtonPanel implements
TableCellRenderer {
RadioButtonRenderer(String[] strs) {
super(strs);
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Integer) {
setSelectedIndex(((Integer) value).intValue());
}
return this;
}
}
class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
RadioButtonPanel panel;
public RadioButtonEditor(JCheckBox checkBox, RadioButtonPanel panel) {
super(checkBox);
this.panel = panel;
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButton[] buttons = panel.getButtons();
for (int i = 0; i < buttons.length; i++) {
buttonGroup.add(buttons);
buttons.addItemListener(this);
}
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if (value instanceof Integer) {
panel.setSelectedIndex(((Integer) value).intValue());
}
return panel;
}
public Object getCellEditorValue() {
return new Integer(panel.getSelectedIndex());
}
public void itemStateChanged(ItemEvent e) {
super.fireEditingStopped();
}
}
public static void main(String[] args) {
JRadioButtonTableExample2 frame = new JRadioButtonTableExample2();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(230, 140);
frame.setVisible(true);
}
}
#1 
Herzog постоялец28.12.06 18:54
Herzog
NEW 28.12.06 18:54 
в ответ irena17 28.12.06 11:59
Судя по всему таблицу (или маску) необходимо перед считыванием актуализировать.
#2 
irena17 местный житель28.12.06 23:38
NEW 28.12.06 23:38 
в ответ Herzog 28.12.06 18:54
пыталась repaint() delat', no ne pomoglo.
#3 
irena17 местный житель28.12.06 23:43
NEW 28.12.06 23:43 
в ответ irena17 28.12.06 11:59
подскажите, может что-то делаю не так? Наверняка опытные программисты на форуме есть. Ребята, пожалуйста, помогите, бьюсь долго с етой ерундой, самой уже интересно, почему так происходит.
#4 
kibalchish прохожий29.12.06 14:10
NEW 29.12.06 14:10 
в ответ irena17 28.12.06 11:59
У тебя твой код компилируется?
#5 
irena17 местный житель30.12.06 00:57
NEW 30.12.06 00:57 
в ответ kibalchish 29.12.06 14:10, Последний раз изменено 30.12.06 00:59 (irena17)
да компилируется, только пакет еще сверху указать надо, в котором у тебя код лежит.
#6 
kibalchish прохожий02.01.07 16:11
NEW 02.01.07 16:11 
в ответ irena17 30.12.06 00:57
class RadioButtonPanel extends JPanel {
JRadioButton[] buttons;
RadioButtonPanel(String[] str) {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
buttons = new JRadioButton[str.length];
for (int i = 0; i < buttons.length; i++) {
buttons = new JRadioButton(str);
buttons.setFocusPainted(false);
add(buttons);
}
}
Меня несколько смущает использование элементов buttons без индекса в цикле. это новая особенность в Java6?
#7 
irena17 местный житель04.01.07 11:58
NEW 04.01.07 11:58 
в ответ kibalchish 02.01.07 16:11, Последний раз изменено 04.01.07 12:05 (irena17)
ну конечно, с индексом, не пойму куда ети индексы делисъ. В коде они естъ, видимо при копировании сюда произошла такая ерунда. Спасибо вам, что указали, хотъ единственный человек код посмотрел! Вопрос еще актуален!
Пытаюсъ корректироватъ сообщение, там все на месте. А здесъ в сообщении квадратные скобки не отображаются.
#8 
  scorpi_ nobody04.01.07 12:29
NEW 04.01.07 12:29 
в ответ irena17 04.01.07 11:58
Замените индекс на j. i в квадратных скобках форумный движок принимает за тег курсива. И - при считывании выделенных RadioButtons, получаю все, кроме последней нажатой - добавьте этот самый код, считывающий значения кнопок. Самому доводить Ваш код до ума некогда.
#9 
irena17 местный житель05.01.07 11:29
NEW 05.01.07 11:29 
в ответ scorpi_ 04.01.07 12:29
Код, считываюший значение кнопок я конечно сделала. проблема в том, что визуалъно RadioButton была выделена, но при считывании значений кнопок, последняя нажатая не определяласъ, как-будто ее и не нажимали, хотя на екране она была выделена.
#10 
irena17 местный житель05.01.07 11:35
NEW 05.01.07 11:35 
в ответ irena17 05.01.07 11:29
Всем огромное спасибо, решение найдено, УРА
"Посадила" на каждую кнопку в RadioButtonEditor ActionListener и добавила туда методу stopCellEditing(); и заработало.
buttons[j].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopCellEditing();
}
});

#11 
  scorpi_ nobody05.01.07 11:36
05.01.07 11:36 
в ответ irena17 05.01.07 11:29
Ну так вставьте его в свой пример, тогда я посмотрю, и может быть скажу в чём дело.
#12 
irena17 местный житель05.01.07 13:22
NEW 05.01.07 13:22 
в ответ scorpi_ 05.01.07 11:36
Спасибочки болъшое за готовностъ помочъ
Я уже разобраласъ. Смотрите мой предыдущий пост.
Каждый клик на RadioButton инициализировался толъко при последующем Клике на другой Компонент , я исполъзовала стандартный метод, делающий инициализацию сразу после каждого Клика, не дожидаясъ следуюшего. Надеюсъ я понятно описала проблему.
#13