열 중 하나의 셀 편집기를 JSpinner로 설정하고 작동하지만 데이터 모델의 데이터가 변경되면 이전에 활성화 된 편집기는 여전히 활성화되지 않습니다. 이전 행의 값 (존재하지 않거나 변경된 데이터의 다른 위치에 있음).테이블 데이터 모델 변경 후 JTable cellEditor가 유지됩니다.
데이터가 변경 될 때 입력 한 값을 저장하지 않고 선택한 셀의 편집기를 사라지게하려면 어떻게해야합니까?
열 중 하나의 셀 편집기를 JSpinner로 설정하고 작동하지만 데이터 모델의 데이터가 변경되면 이전에 활성화 된 편집기는 여전히 활성화되지 않습니다. 이전 행의 값 (존재하지 않거나 변경된 데이터의 다른 위치에 있음).테이블 데이터 모델 변경 후 JTable cellEditor가 유지됩니다.
데이터가 변경 될 때 입력 한 값을 저장하지 않고 선택한 셀의 편집기를 사라지게하려면 어떻게해야합니까?
이 하나가 더 빨리 더 나은 도움을 SSCCE
import java.awt.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class SpinnerColumn extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private static final long serialVersionUID = 1L;
private JSpinner editSpinner, renderSpinner;
private JTable table;
private String[] list;
private Border originalBorder;
public SpinnerColumn(JTable table, int column) {
editSpinner = new JSpinner();
renderSpinner = new JSpinner();
originalBorder = editSpinner.getBorder();
editSpinner.setBorder(new LineBorder(Color.BLUE));
this.table = table;
table.getColumnModel().getColumn(column).setCellEditor(this);
}
public SpinnerColumn(String[] list, JTable table, int column) {
editSpinner = new JSpinner();
editSpinner.setModel(new SpinnerListModel(list));
renderSpinner = new JSpinner();
originalBorder = editSpinner.getBorder();
editSpinner.setBorder(new LineBorder(Color.BLUE));
this.list = list;
this.table = table;
table.getColumnModel().getColumn(column).setCellEditor(this);
}
@Override
public Object getCellEditorValue() {
return editSpinner.getValue();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
if (list != null) {
editSpinner.setValue(list[0]);
} else {
editSpinner.setValue(0);
}
if (value != null) {
editSpinner.setValue(value);
}
return editSpinner;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if (hasFocus) {
renderSpinner.setBorder(new LineBorder(Color.BLUE));
} else {
renderSpinner.setBorder(originalBorder);
}// *** here's where we set the spinner's value
if (value == null) {
renderSpinner.setValue(0);
} else {
int intValue = ((Integer) value).intValue();
renderSpinner.setValue(intValue);
}
return renderSpinner;
}
@Override
public boolean isCellEditable(EventObject evt) {
return true;
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("SpinnerColumn");
JPanel panel = new JPanel(new GridLayout(1, 1));
JTable table = new JTable(5, 1);
SpinnerColumn spinnerColumn = new SpinnerColumn(table, 0);
table.setDefaultRenderer(Object.class, spinnerColumn);
panel.add(table);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
내 코드는이 코드 또는 하나의 매우 유사한 기반으로, jTable1.getCellEditor (행, 열) 찾았습니다 .stopCellEditing() 날 멋지게 작동합니다. – user554033
좋은 스레드 +1 감사합니다 – mKorbel
좋은 코드 일 [SSCCE]와 질문을 편집 할 수 있습니다 (http://sscce.org/) – mKorbel
내가하려고합니다 그런데 jtable.doSomethingWithEditors() 같은 셀 편집기를 숨길 방법이 있습니까? 아니면 내가 뭔가 잘못하고 데이터 변경 후 세포가 편집해서는 안된다? – user554033