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

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

DDD
풀어 주다: 2024-12-06 07:17:11
원래의
538명이 탐색했습니다.

How to Maintain Custom JTable Cell Rendering After Editing?

렌더링 편집 번호: 셀 편집 후 JTable 형식 유지

사용자 정의 셀 렌더링으로 JTable을 확장하는 경우 해당 렌더링을 유지하는 것이 중요합니다. 셀 편집 후. 여기에는 셀 렌더러 내의 서식 유지가 포함됩니다.

문제:

사용자 정의 셀 렌더러로 서식이 지정된 JTable 열에 대해 JTextField 편집기를 구현한 후 셀의 사용자 정의가 손실됩니다. 편집 시 렌더링

해결책:

모델이 셀 값 변경 시 렌더러를 업데이트하지 않기 때문에 서식이 손실됩니다. 이 문제를 해결하려면 테이블 모델이 변경된 후 셀 렌더러가 호출되는지 확인하세요.

구현:

  • 원하는 형식을 처리하도록 기본 렌더러를 확장합니다( 예를 들어, MoneyRenderer).
  • 기본 편집기(예: MoneyEditor)를 확장하고 값을 편집하고 렌더링하기 위한 getCellEditorValue() 및 getTableCellEditorComponent() 메서드.
  • 편집기에서 텍스트 선택을 보장하려면 테이블의 getTableCellEditorComponent() 메서드(예: editStopped())를 재정의하세요.
  • 제공된 예제에서 CurrentRenderer 및 MoneyEditor 클래스는 JTable의 통화 형식을 처리합니다. 셀 편집 시 값이 올바르게 구문 분석되고 형식이 지정되고 렌더링됩니다.

예제 코드:

제공된 예제 코드는 JTable을 생성하여 이러한 접근 방식을 보여줍니다. 셀 편집 후에도 서식을 유지하는 통화 형식 열 사용:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;
import java.util.EventObject;

public class RenderEditNumber extends JPanel {

    private NumberFormat nf = NumberFormat.getCurrencyInstance();

    public RenderEditNumber() {
        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) {

            @Override // Always selectAll()
            public boolean editCellAt(int row, int column, EventObject e) {
                boolean result = super.editCellAt(row, column, e);
                final Component editor = getEditorComponent();
                if (editor == null || !(editor instanceof JTextComponent)) {
                    return result;
                }
                EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        ((JTextComponent) editor).selectAll();
                    }
                });
                return result;
            }
        };
        table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf));
        table.setDefaultEditor(Double.class, new CurrencyEditor(nf));
        add(new JScrollPane(table));
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new RenderEditNumber().display());
    }
}

class CurrencyRenderer extends DefaultTableCellRenderer {

    private NumberFormat formatter;

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

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

class CurrencyEditor extends DefaultCellEditor {

    private NumberFormat formatter;
    private JTextField textField;

    public CurrencyEditor(NumberFormat formatter) {
        super(new JTextField());
        this.formatter = formatter;
        textField = (JTextField) 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;
    }
}
로그인 후 복사

이 접근 방식을 활용하면 JTable 셀은 편집 후에도 맞춤형 렌더링을 유지하므로 일관된 데이터 표시와 향상된 사용자 경험이 가능합니다.

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

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