जब आप टाइपिंग शुरू करते हैं, तो क्लिक करने पर क्लिक किए गए स्थान पर कैरेट रखने के लिए जेटीबल का डिफ़ॉल्ट व्यवहार सामग्री को जोड़ना होता है। मैं इन दोनों चीजों का व्यवहार बदलना चाहता हूं, इसलिए जब मैं एक सेल संपादित करता हूं, या तो टाइप करके या क्लिक करके और फिर टाइप करके सामग्री को प्रतिस्थापित किया जाता है। जब मैं एक सेल पर क्लिक करता हूं और फिर कैरेट स्थिति बदलता हूं, हालांकि, मैं सामग्री को रहना चाहता हूं ताकि मैं इसे बदल सकूं।संपादित करते समय JTable सेल में सभी टेक्स्ट का चयन कैसे करें, लेकिन टाइप करते समय नहीं?
मुझे पता है कि जब सेल संपादित हो रहा है, तो सेल संपादक को बदलकर, सभी को चुनने के लिए, एक स्विंगउटिविटीज.inवोकलेटर के अंदर सभी का चयन करें (elsewhere देखें), लेकिन यह टाइपिंग व्यवहार को तोड़ने का कारण बनता है। जब मैं ऐसा करता हूं और सेल में टाइप करना शुरू करता हूं, तो पहले टाइप किए गए वर्ण को स्ट्रिंग में जोड़ दिया जाता है, फिर यह चुना जाता है (लेकिन चयन अदृश्य है!) और जब कोई अन्य अक्षर टाइप करते हैं तो सामग्री उस स्थान से बदल जाती है।
क्या हाइलाइट किए गए (लेकिन संपादन नहीं) सेल में टाइप करते समय तुरंत सामग्री को प्रतिस्थापित करने का कोई तरीका है, लेकिन सेल पर क्लिक करते समय सभी का चयन करें?
if (isSelected) {
this.selectAll();
}
एक के रूप में एक तरफ, क्यों विस्तार नहीं AbstractCellEditor
या DefaultCellEditor(JTextField textField)
:
public class TextFieldCellEditor extends JTextField implements TableCellEditor
{
private CellEditorListener cellEditorListener = null;
private boolean isInteger = false;
private Object oldValue;
// Start editing
@Override
public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int column)
{
Color color2 = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
super.setBackground(color2 != null && (row & 1) == 1? color2 : table.getBackground());
super.setForeground(table.getForeground());
super.setBorder(DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder"));
super.setText(obj.toString());
isInteger = obj instanceof Integer;
if (isInteger)
{
super.setHorizontalAlignment(SwingConstants.RIGHT);
oldValue = obj;
}
// SwingUtilities.invokeLater(new Runnable()
// {
// public void run()
// {
// TextFieldCellEditor.this.selectAll();
// }
// });
return this;
}
// Retrieve e dited value
@Override
public Object getCellEditorValue()
{
if (isInteger)
{
// Try to convert to integer. If input is invalid, revert.
try
{
return new Integer(super.getText());
}
catch (NumberFormatException e)
{
return oldValue;
}
}
return super.getText();
}
@Override
public boolean isCellEditable(EventObject e)
{
return true;
}
@Override
public boolean shouldSelectCell(EventObject e)
{
return true;
}
@Override
public boolean stopCellEditing()
{
cellEditorListener.editingStopped(new ChangeEvent(this));
return true;
}
@Override
public void cancelCellEditing()
{
cellEditorListener.editingCanceled(new ChangeEvent(this));
}
@Override
public void addCellEditorListener(CellEditorListener celleditorlistener)
{
cellEditorListener = celleditorlistener;
}
@Override
public void removeCellEditorListener(CellEditorListener celleditorlistener)
{
if (cellEditorListener == cellEditorListener) cellEditorListener = null;
}
}
यह कार्यान्वयन अमान्य है: ए) एक से अधिक श्रोता जोड़ने का समर्थन नहीं करता है b) _internal_ कारणों (जैसे एंटरप्राइज़ करने की तरह) के लिए बंद/रद्द होने पर अपने श्रोता को सूचित नहीं करता है, क्या आवश्यक है इसका विचार प्राप्त करने के लिए DefaultCellEditor का स्रोत देखें – kleopatra
से अधिक ks। ठीक कर दिया। –