Jbutton на ячейке Jtable работает только один раз - PullRequest
1 голос
/ 16 декабря 2010

Я новичок в Java Swing и у меня есть проблемы с Jbutton в ячейке Jtable.

Проблема в том, что Jbutton работает только один раз, а затем он не работает. После первого раза, когда я нажимаю снова, ничего не происходит, getTableCellEditorComponent вызывается только один раз. Я хочу, чтобы он работал как обычная кнопка.

Классы «Мой редактор кнопок» и «Средство рендеринга кнопок»:

package buttonontable;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import java.util.HashMap;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;


 public class MyButtonEditor extends JButton implements TableCellEditor {
  protected JButton button;
  ButtonOnJtableAction buttonOnJtableAction;

  String labelStr;




  public MyButtonEditor(String buttonStr,ButtonOnJtableAction _buttonOnJtableAction) {
    super(buttonStr);
    buttonOnJtableAction = _buttonOnJtableAction;
    button = new JButton();
    button.setOpaque(true);
    System.out.println("MyButtonEditor constructed");

     }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {


        System.out.println("getTableCellEditorComponent");
        JOptionPane.showMessageDialog(table, "Pressed at " + row + "x" + column);
        buttonOnJtableAction.buttonPressed(table,row,column);
        return this;
    }

    public void cancelCellEditing() {
        System.out.println("cancelCellEditing");
        System.out.println("Cancel");
    }

    public boolean stopCellEditing() {
        System.out.println("stopCellEditing");
        return true;
    }

    public Object getCellEditorValue() {
        System.out.println("getCellEditorValue");
        return null;
    }

    public boolean isCellEditable(EventObject anEvent) {
        return true;
    }

    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    public void addCellEditorListener(CellEditorListener l) {
    }

    public void removeCellEditorListener(CellEditorListener l) {
    }

    protected void fireCellEditing(ChangeEvent e){

    }

}



    package buttonontable;

    import java.awt.Component;
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellRenderer;


        public class MyButtonRenderer extends JButton implements TableCellRenderer {

          String buttonStr;
          public MyButtonRenderer(String _buttonStr) {
            setOpaque(true);
            buttonStr = _buttonStr;
            setText(buttonStr);
          }

          public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {

           System.out.println("getTableCellRendererComponent");

            if (isSelected) {
              setForeground(table.getSelectionForeground());
              setBackground(table.getSelectionBackground());
            } else{
              setForeground(table.getForeground());
              setBackground(UIManager.getColor("Button.background"));
            }
            setText( (value ==null) ? buttonStr : value.toString() );
            return this;
          }
        }

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

Я хочу, чтобы он работал как обычная кнопка.

Если это означает, что вы хотите вызвать действие при нажатии кнопки, то вы можете проверить Столбец столбца кнопки для одного подхода.

1 голос
/ 16 декабря 2010

Обычно, когда мне нужно это сделать, я обращаюсь к http://download.oracle.com/javase/6/docs/api/, затем перехожу к JTable в левой части страницы и в начале страницы JTable Javadoc есть ссылка на «Как использовать таблицы».Внизу находится пример того, как поместить кнопку в JTable.Похоже, что раздел на этой странице "Использование других редакторов".Я обычно следую тому, что указано СОЛНЦЕ.Надеюсь, это немного поможет ...

0 голосов
/ 03 апреля 2011

Попробуйте Esc и нажмите еще раз. Если это работает сейчас, это вопрос фокуса.
Не исправляйте это, следуйте ответу camickr или ответвлению .

Основная схема должна выглядеть следующим образом:

Renderer:

class MyClassCellRenderer implements TableCellRenderer {

private final JButton button;

public MyClassCellRenderer() {
  button = new JButton();
  button.setFocusable(false);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value,        boolean isSelected, boolean hasFocus, int row, int column) {
  button.setText(((Contact)value).getName());
  return button;
}
}

Редактор:

class MyClassCellEditor extends AbstractCellEditor implements TableCellEditor {
private final JButton button;

public MyClassCellEditor() {
  button = new JButton(new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
      logger.trace("I");
    }
  });
  button.setFocusable(false);
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value,      boolean isSelected, int row, int column) {
  button.setText(((Contact)value).getName());
  return button;
}

@Override
public Object getCellEditorValue() {
  return null;
}
}

Использование:

model.getColumn(0).setCellRenderer(new MyClassCellRenderer());
model.getColumn(0).setCellEditor(new MyClassCellEditor());
...