Buttons from JTable borrow the text of the other columns

Viewed 26

Every time I click on the task column, the buttons column have the same text as the task column. How could I make that the button keep the text and also very important my buttons are not clickable. What should I do? enter image description here

//table
    JTable table = new JTable(0,1){
        @Override
        public boolean isCellEditable(int row, int column) {
            if(column==1)return false;
            return true;
        }
    };
    table.setPreferredScrollableViewportSize(new Dimension(100, 100));
    table.setFillsViewportHeight(true);
    table.setRowHeight(50);
    JScrollPane pane = new JScrollPane(table);

    TableColumn statusColumn=new TableColumn();
    statusColumn.setHeaderValue("Status");
    statusColumn.setMaxWidth(80);
    statusColumn.setPreferredWidth(80);
    statusColumn.setCellRenderer(new ButtonRenderer());
    statusColumn.setCellEditor(new ButtonEditor(new JCheckBox()));
    table.addColumn(statusColumn);

    table.getColumn("A").setHeaderValue("Task");

    //add task button:
    JButton addTask = new JButton("Add task");
    addTask.addActionListener(e -> {
        DefaultTableModel tm = (DefaultTableModel) table.getModel();
        tm.addRow(new Object[]{});
    });
    addTask.setBounds(0, 70, 100, 30);

    add(addTask);
    add(pane);
    add(title, BorderLayout.NORTH);

Here's the code from button renderer and editor:

class ButtonRenderer extends JButton implements TableCellRenderer {

public ButtonRenderer() {
    setOpaque(true);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
                                               boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
        setForeground(table.getSelectionForeground());
        setBackground(table.getSelectionBackground());
    } else {
        setForeground(table.getForeground());
        setBackground(UIManager.getColor("Button.background"));
    }
    setText((value == null) ? "" : value.toString());
    return this;
}

}

class ButtonEditor extends DefaultCellEditor {

protected JButton button;
private String label;
private boolean isPushed;

public ButtonEditor(JCheckBox checkBox) {
    super(checkBox);
    button = new JButton();
    button.setOpaque(true);
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            fireEditingStopped();
        }
    });
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value,
                                             boolean isSelected, int row, int column) {
    if (isSelected) {
        button.setForeground(table.getSelectionForeground());
        button.setBackground(table.getSelectionBackground());
    } else {
        button.setForeground(table.getForeground());
        button.setBackground(table.getBackground());
    }
    label = (value == null) ? "" : value.toString();
    button.setText(label);
    isPushed = true;
    return button;
}

@Override
public Object getCellEditorValue() {
    if (isPushed) {
        JOptionPane.showMessageDialog(button, label + ": Ouch!");
    }
    isPushed = false;
    return label;
}

@Override
public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
}

}

0 Answers
Related