JXTable을 사용하여 데이터를 렌더링하고 편집 할 때 CellEditors에 대한 일부 입력이 손실됩니다. JXTable-ColumnHeader의 Resizing-Divider를 클릭하거나 JFrame의 너비를 변경하면 CellEditor는 값을 커밋하지 않고 종료됩니다. JTable를 사용하면 값이 저장됩니다.JTable이 입력을 잃는 이유는 무엇입니까?
다른 기능 때문에 JXTable을 사용하고 싶습니다. JXTable을 수정하는 방법이 있습니까?
예 :
package table.columnresize;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXTable;
/**
* Demo of differing behaviour of JXTable and JTable. JXTable loses input in a TableCell where JTable persists
* it.
* <p>
* <table border=1>
* <tr>
* <th></th>
* <th>JXTable</th>
* <th>JTable</th>
* </tr>
* <tr>
* <td>Click on TableColumnHeader</td>
* <td>saved</td>
* <td>saved</td>
* </tr>
* <tr>
* <td>Resizing with Divider of TableColumnHeader</td>
* <td>lost</td>
* <td>saved</td>
* </tr>
* <tr>
* <td>Changing the width of JFrame</td>
* <td>lost</td>
* <td>saved</td>
* </tr>
*
* </table>
* </p>
*
* @author bobndrew 2015-01-29
*/
public class JXTableAndJTableEditLossDemo
{
private static class DataModel extends DefaultTableModel
{
public DataModel(Object[][] data, Object[] columnNames)
{
super(data, columnNames);
}
}
private static void createAndShowUI()
{
Object[][] DATA = { { "One", 1 }, { "Two", 2 }, { "Three", 3 }, { "Four", 4 }, { "Five", 5 } };
String[] COLUMNS = { "A", "B" };
DataModel dataModel = new DataModel(DATA, COLUMNS);
JFrame frame1 = new JFrame("JXTable");
JXTable jXTable = new JXTable(dataModel);
//does not change anything: jXTable.setTerminateEditOnFocusLost(true);
System.out.println(jXTable.isTerminateEditOnFocusLost());
frame1.add(new JScrollPane(jXTable));
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.pack();
frame1.setVisible(true);
JFrame frame2 = new JFrame("JTable");
JTable jTable = new JTable(dataModel);
//does not change anything: jTable.putClientProperty("terminateEditOnFocusLost", Boolean.FALSE);
System.out.println(jTable.getClientProperty("terminateEditOnFocusLost"));
frame2.add(new JScrollPane(jTable));
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.pack();
frame2.setLocation((int) frame1.getLocation().getX() + frame1.getWidth() + 100, (int) frame1
.getLocation().getY());
frame2.setVisible(true);
}
public static void main(String[] args)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowUI();
}
});
}
}
JXTable에 사용자 지정 포커스 수신기를 추가해 보았습니까? 이 게시물에 대한 2 ~ 3 번째 답변을 참조하십시오. http://stackoverflow.com/questions/1652942/can-a-jtable-save-data-whenever-a-cell-loses-focus –
좋은 생각이지만 FocusListener는 다른 OperatingSystems에서 너무 신뢰할 수 없습니다. – bobndrew