문제

나는 Excel처럼 작동하는 테이블을 만들려고 노력하고 있습니다. 즉, 사용자가 셀에 데이터를 삽입하기 시작하면 삽입 된 새 데이터에 의해 컨텐츠를 선택하고 변경합니다.

도움이 되었습니까?

해결책

테이블에 대한 사용자 정의 식탁보를 만들 수 있습니다. 이 클래스는 a의 인스턴스 변수를 갖습니다 TextField, 그것을 부를 것입니다 textField. 그럼 getTableCellEditorComponent 방법은 다음과 같습니다.

public Component getTableCellEditorComponent(JTable table, Object value, 
                             boolean isSelected, int row, int column ) {
    textField.setText(value.toString());
    textField.selectAll();
    return textField;
}

다른 팁

사용자 정의 편집기를 만드는 것은 테이블에 문자열 데이터 만 있고 단일 편집기 만 있으면 잘 작동합니다. 그러나 문자열, 정수, 이중, 통화, 백분율 등과 같은 여러 가지 유형의 데이터가있는 경우 모두 jtextfield를 편집기로 사용하는 경우 여러 사용자 정의 편집기를 만들어야합니다.

당신은에서 읽을 수 있습니다 테이블 모든 편집기를 선택하십시오 다른 가능한 솔루션.

또 다른 가능성도 있습니다. 다음과 같이 JTable#PreparedEditor를 무시할 수 있습니다.

@Override
public Component prepareEditor(TableCellEditor editor, int row, int column) {
    Component c = super.prepareEditor(editor, row, column);
    if (c instanceof JTextComponent) {
        ((JTextComponent) c).selectAll();
    } 
    return c;
}

마우스 클릭으로 편집이 시작될 때 위의 솔루션이 작동하지 않습니다.

어떤 사람들의 경우 솔루션은 invokelater ()에서 selectall ()을 호출하여 마우스 이벤트가 발송 된 후 텍스트가 선택되도록하는 것입니다. 그러나 이것은 나에게 효과적이지 않습니다 (아마도 물질 모양과 느낌을 사용하기 때문에 아마도 효과가 있습니까? )

스윙 내부는 나중에 MouserEleled () 이벤트를 받고이 스택 추적에 표시된대로 코렛을 다시 변경합니다.

at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(Unknown Source)

내 해결책은 다음과 같습니다.CARET 위치 변경 사항을 듣고 선택이 선택된 모든 것에서 셀 편집이 시작된 후 선택된 NONE으로 처음으로 선택할 때 SelectAll ()을 다시 호출하십시오. 간병 청취자는 여기에 표시된대로 사용자 정의 셀 편집기 또는 사용자 정의 jtable의 재정의 editcellat () 메소드에 설치할 수 있습니다.

private class SelectAllCellEditor extends DefaultCellEditor
{
    public SelectAllCellEditor( JTextField tf )
    {
        super( tf );
    }

    /**
     * Flag to ensure we only install the caret listener on the editor once.
     */
    boolean listenerInstalled   = false;
    /**
     * Primes the caret listener to override deselection when the first mouseReleased() event is reposted to the editor.
     */
    boolean overrideDeselection = false;

    @Override
    public Component getTableCellEditorComponent( JTable table , Object value , boolean isSelected , int row , int column )
    {
        final JFormattedTextField tf = ( JFormattedTextField ) super.getTableCellEditorComponent( table , value , isSelected , row , column );

        if( !listenerInstalled )
        {
            tf.addCaretListener( new CaretListener( )
            {
                int lastDot     = 0;
                int lastMark    = 0;

                @Override
                public void caretUpdate( CaretEvent e )
                {
                    if( overrideDeselection )
                    {
                        int length = tf.getText( ) == null ? 0 : tf.getText( ).length( );

                        boolean wasAllSelected = ( lastDot == 0 && lastMark == length ) || ( lastDot == length && lastMark == 0 );
                        boolean nowNoneSelected = ( e.getDot( ) == 0 && e.getMark( ) == 0 ) || ( e.getDot( ) == length && e.getMark( ) == length );

                        if( wasAllSelected )
                        {
                            // don't try to override again until the next time cell editing is started
                            overrideDeselection = false;

                            // only re-select all if the selection went to none; otherwise the user clicked the cell and dragged to select part of the text
                            if( nowNoneSelected )
                            {
                                tf.selectAll( );
                            }
                        }
                    }

                    lastDot = e.getDot( );
                    lastMark = e.getMark( );
                }
            } );
            listenerInstalled = true;
        }

        // Prime the caret listener to override deselection when the first mouseReleased() event is reposted to the editor.
        overrideDeselection = true;
        tf.selectAll( );
        return tf;
    }
}

편집이 시작될 때 셀을 비우는 목표가 사용되는 경우 사용할 필요가 없습니다. selectAll(). 단순히 가치를 설정하십시오 null.

구현 예 :

(재정의 getTableCellEditorComponent() 안에 DefaultCellEditor)

TableCellEditor myCellEditor = new DefaultCellEditor(new JTextField()){
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column)
    {
        // empty the cell on edit start
        delegate.setValue( (editorComponent instanceof JTextField)? null : value);
        return editorComponent;
    }
};

extjs를보아야합니다. 그래도 꽤 가파른 학습 곡선이 있습니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top