JTable中的按钮不会执行操作

时间:2014-01-17 13:31:33

标签: java button jtable renderer

我有JTable我在每行插入了两个按钮(删除,搜索)。 对于每个按钮,我在构造函数中指定了正确的操作,如下所示:

        Action search = new AbstractAction() {

        public void actionPerformed(ActionEvent e) {
            JTable table = (JTable) e.getSource();
            int modelRow = Integer.valueOf(e.getActionCommand());
            System.out.println("Search action for row: " + modelRow);

            // do some processing here
            // tb.searchMore(modelRow);
        }
    };

然后我指定按钮应该创建到哪一列:

    // column 4 of JTable table should implement action 'search'
    ButtonColumn searchButtonColumn = new ButtonColumn(table, search, 4);
    searchButtonColumn.setMnemonic(KeyEvent.VK_D);

我有一个合适的Button Renderer Class。 删除按钮(正在以完全相同的方式创建和初始化)工作正常。我为另一个表创建的类似保存按钮也是如此。 问题出在搜索按钮上。它在表格中创建了图形按钮,但它的动作永远不会被实际调用。我注意到当我将它放在第一个柱子的另一个柱子中时会发生这种情况。对这种奇怪行为的任何想法?我放置它的列不是出界的。将两个按钮放在同一行是否有问题?

以下是Button Renderer代码:

public class ButtonColumn extends AbstractCellEditor
    implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener {

private JTable table;
private Action action;
private int mnemonic;
private Border originalBorder;
private Border focusBorder;
private JButton renderButton;
private JButton editButton;
private Object editorValue;
private boolean isButtonColumnEditor;

/**
 *  Create the ButtonColumn to be used as a renderer and editor. The
 *  renderer and editor will automatically be installed on the TableColumn
 *  of the specified column.
 *
 *  @param table the table containing the button renderer/editor
 *  @param action the Action to be invoked when the button is invoked
 *  @param column the column to which the button renderer/editor is added
 */
public ButtonColumn(JTable table, Action action, int column) {
    this.table = table;
    this.action = action;

    renderButton = new JButton();
    editButton = new JButton();
    editButton.setFocusPainted(false);
    editButton.addActionListener(this);
    originalBorder = editButton.getBorder();
    setFocusBorder(new LineBorder(Color.BLUE));

    TableColumnModel columnModel = table.getColumnModel();
    columnModel.getColumn(column).setCellRenderer(this);
    columnModel.getColumn(column).setCellEditor(this);
    table.addMouseListener(this);
}

/**
 *  Get foreground color of the button when the cell has focus
 *
 *  @return the foreground color
 */
public Border getFocusBorder() {
    return focusBorder;
}

/**
 *  The foreground color of the button when the cell has focus
 *
 *  @param focusBorder the foreground color
 */
public void setFocusBorder(Border focusBorder) {
    this.focusBorder = focusBorder;
    editButton.setBorder(focusBorder);
}

public int getMnemonic() {
    return mnemonic;
}

/**
 *  The mnemonic to activate the button when the cell has focus
 *
 *  @param mnemonic the mnemonic
 */
public void setMnemonic(int mnemonic) {
    this.mnemonic = mnemonic;
    renderButton.setMnemonic(mnemonic);
    editButton.setMnemonic(mnemonic);
}

@Override
public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column) {
    if (value == null) {
        editButton.setText("");
        editButton.setIcon(null);
    } else if (value instanceof Icon) {
        editButton.setText("");
        editButton.setIcon((Icon) value);
    } else {
        editButton.setText(value.toString());
        editButton.setIcon(null);
    }

    this.editorValue = value;
    return editButton;
}

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

//
//  Implement TableCellRenderer interface
//
public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int  column) {
    if (isSelected) {
        renderButton.setForeground(table.getSelectionForeground());
        renderButton.setBackground(table.getSelectionBackground());
    } else {
        renderButton.setForeground(table.getForeground());
        renderButton.setBackground(UIManager.getColor("Button.background"));
    }

    if (hasFocus) {
        renderButton.setBorder(focusBorder);
    } else {
        renderButton.setBorder(originalBorder);
    }

//      renderButton.setText( (value == null) ? "" : value.toString() );
    if (value == null) {
        renderButton.setText("");
        renderButton.setIcon(null);
    } else if (value instanceof Icon) {
        renderButton.setText("");
        renderButton.setIcon((Icon) value);
    } else {
        renderButton.setText(value.toString());
        renderButton.setIcon(null);
    }

    return renderButton;
}

//
//  Implement ActionListener interface
//
/*
 *  The button has been pressed. Stop editing and invoke the custom Action
 */
public void actionPerformed(ActionEvent e) {
    int row = table.convertRowIndexToModel(table.getEditingRow());
    fireEditingStopped();

    //  Invoke the Action

    ActionEvent event = new ActionEvent(table,
            ActionEvent.ACTION_PERFORMED, "" + row);
    action.actionPerformed(event);
}

//
//  Implement MouseListener interface
//
/*
 *  When the mouse is pressed the editor is invoked. If you then then drag
 *  the mouse to another cell before releasing it, the editor is still
 *  active. Make sure editing is stopped when the mouse is released.
 */
public void mousePressed(MouseEvent e) {
    if (table.isEditing()
            && table.getCellEditor() == this) {
        isButtonColumnEditor = true;
    }
}

public void mouseReleased(MouseEvent e) {
    if (isButtonColumnEditor
            && table.isEditing()) {
        table.getCellEditor().stopCellEditing();
    }

    isButtonColumnEditor = false;
}

public void mouseClicked(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
}

1 个答案:

答案 0 :(得分:0)

我猜你忘了将动作命令设置为渲染按钮。您在行动中依赖该命令。尝试像

这样的东西
editButton.setActionCommand(String.valueOf(column));

在您的单元格渲染器中。