2015-01-30 2 views
8

JXTable을 사용하여 데이터를 렌더링하고 편집 할 때 CellEditors에 대한 일부 입력이 손실됩니다. JXTable-ColumnHeader의 Resizing-Divider를 클릭하거나 JFrame의 너비를 변경하면 CellEditor는 값을 커밋하지 않고 종료됩니다. JTable를 사용하면 값이 저장됩니다.JTable이 입력을 잃는 이유는 무엇입니까?

다른 기능 때문에 JXTable을 사용하고 싶습니다. JXTable을 수정하는 방법이 있습니까?

Screenrecording

예 :

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(); 
     } 
    }); 
    } 

} 
+0

JXTable에 사용자 지정 포커스 수신기를 추가해 보았습니까? 이 게시물에 대한 2 ~ 3 번째 답변을 참조하십시오. http://stackoverflow.com/questions/1652942/can-a-jtable-save-data-whenever-a-cell-loses-focus –

+0

좋은 생각이지만 FocusListener는 다른 OperatingSystems에서 너무 신뢰할 수 없습니다. – bobndrew

답변

3

JXTableJTable을 디버깅하는 동안 CellEdits가 손실 된 이유를 발견했습니다.

JXTable :

if (isEditing()) { 
    removeEditor(); 
} 

의 JTable : 차이는 방법 columnMarginChanged()에 I가 removeEditor() 방법은 JTable의 향상이다 생각 우선

if (isEditing() && !getCellEditor().stopCellEditing()) { 
    getCellEditor().cancelCellEditing(); 
} 

... 그런데 I "4330950 : 열 너비의 크기를 조정할 때 셀에 새로 입력 한 데이터가 손실되었습니다" 버그를 수정하는 OpenJDK changeset from September 2010을 발견했습니다. JDK의 변경 사항이 SwingX 소스 코드에 적용되지 않은 것으로 보입니다.

나는 다른 행동에 대한 이유가 이제 분명하기 때문에 내 자신의 대답을 받아 들일 것입니다. 나와 다른 SwingX 사용자를 위해이 문제를 해결하려면 SwingX 메일 링리스트와 버그 추적기로 넘어갈 것입니다.

1

당신의 JTable의 frameInit() 메소드를 살펴보고, 당신이 모든 AWTEvent.WINDOW * 이벤트에 결합하는 것을 볼 수 있습니다. JXTable에서 initActionsAndBindings() 메소드는 값 변경과 같은 특정 액션과 테이블에 대해서만 바인드합니다. 그런 다음 자신의 청취자에게

jXTable.getColumnModel().addColumnModelListener(new TableColumnModelListener() { 
     @Override 
     public void columnMarginChanged(ChangeEvent e) { 

     } 
    }); 

을 추가해야합니다

이벤트가 테이블을 업데이트 트리거 할 수 있도록 테이블의 일부 기능을 노출해야합니다. 또는 거기에서 TableModelEvent를 트리거 할 수 있습니다.

+0

'frameInit()'은'JTable.java'가 아니라'JFrame.java'에있는 메소드입니다. 그러나'TableColumnModelListener'와'columnMarginChanged()'에 대한 여러분의 아이디어는 저의 연구 결과와 유사합니다. 내 대답을 보라. – bobndrew

관련 문제