> Java > java지도 시간 > 셀 편집 후 JTable 셀 렌더링을 유지하는 방법은 무엇입니까?

셀 편집 후 JTable 셀 렌더링을 유지하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-07 05:05:14
원래의
153명이 탐색했습니다.

How to Maintain JTable Cell Rendering After a Cell Edit?

셀 편집 후 JTable 셀 렌더링 유지

문제

JTable 열을 String으로 설정하고 Double로 정렬한 후 사용자 정의 셀 렌더러는 처음에 열 형식을 $###,##0.00으로 지정하여 값이 변경된 후 셀 렌더링을 중지합니다. 편집되었습니다.

해결 방법

이벤트 흐름 이해

셀을 편집하면 다음 이벤트가 순차적으로 발생합니다.

  1. 편집기가 끝납니다. .
  2. 테이블의 editStopped() 메소드는 새 항목을 수집합니다. value.
  3. 모델의 setValueAt()가 새 값으로 호출됩니다.
  4. 모델이 fireTableCellUpdated()를 호출합니다.

솔루션 구현

편집 후 셀 렌더링을 유지하려면 다음 단계를 따르세요. 필요:

  1. 기본 렌더러 확장: 숫자 서식을 처리하려면 기본 렌더러를 확장해야 합니다. 이렇게 하면 렌더러가 값 표시를 담당하게 됩니다.
  2. 렌더러를 편집기 구성 요소로 사용: 경우에 따라 렌더러 인스턴스를 편집기로 사용하는 것이 편리할 수 있습니다. 요소. 이를 통해 표시된 값과 편집된 값 모두에 동일한 형식을 적용할 수 있습니다.

구현 예

다음은 기본 편집기 및 렌더러 구현을 사용하는 기본 예입니다.

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultTableCellRenderer;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.text.NumberFormat;

public class RenderEditNumber {

    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        DefaultTableModel model = new DefaultTableModel(
            new String[]{"Amount"}, 0) {

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return Double.class;
            }
        };
        for (int i = 0; i < 16; i++) {
            model.addRow(new Object[]{Double.valueOf(i)});
        }
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(123, 123));
        table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf));
        table.setDefaultEditor(Double.class, new CurrencyEditor(nf));
    }

    private static class CurrencyRenderer extends DefaultTableCellRenderer {

        private NumberFormat formatter;

        public CurrencyRenderer(NumberFormat formatter) {
            this.formatter = formatter;
            this.setHorizontalAlignment(JLabel.RIGHT);
        }

        @Override
        public void setValue(Object value) {
            setText((value == null) ? "" : formatter.format(value));
        }
    }

    private static class CurrencyEditor extends DefaultCellEditor {

        private NumberFormat formatter;
        private JTextField textField;

        public CurrencyEditor(NumberFormat formatter) {
            super(new JTextField());
            this.formatter = formatter;
            this.textField = (JTextField) this.getComponent();
            textField.setHorizontalAlignment(JTextField.RIGHT);
            textField.setBorder(null);
        }

        @Override
        public Object getCellEditorValue() {
            try {
                return new Double(textField.getText());
            } catch (NumberFormatException e) {
                return Double.valueOf(0);
            }
        }

        @Override
        public Component getTableCellEditorComponent(JTable table,
            Object value, boolean isSelected, int row, int column) {
            textField.setText((value == null)
                ? "" : formatter.format((Double) value));
            return textField;
        }
    }
}
로그인 후 복사

이 예에서 통화Renderer 및CurrencyEditor 클래스는 각각 기본 렌더러 및 편집기 구현을 확장하여 숫자 서식을 처리합니다. 이 예제에는 JTable에 의해 내부적으로 처리되는 fireTableCellUpdated() 호출이 포함되어 있지 않습니다.

위 내용은 셀 편집 후 JTable 셀 렌더링을 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿