2

jTable を作成し、その上に TableCellRenderer、TableCellEditor を作成します。そこに編集可能な (text/html コンテキスト タイプの) JEditorPane を配置する必要があります。コンポーネント内にテキストを書き込んでコンポーネントのサイズを変更すると、テキストが消えます。私が間違っていることは何ですか?さらに、このコンポーネントの上に、テキスト編集のボタンがあります: 例:

JButton bold = new JButton():
bold.setAction(new StyledEditorKit.BoldAction());

それは私のカスタムモデルの一部です:

private JEditorPane editorTxtPane = new JEditorPane("text/html", "");
private JEditorPane rendererTxtPane = new JEditorPane("text/html", "");
private final JPanel editorPanel = new JPanel();
private final JPanel rendererPanel = new JPanel();
private final ArrayList<FocusListener> editorFocusListeners = new ArrayList<FocusListener>();

public SampleModel() {
    super();

    rendererTxtPane.setContentType("text/html");
    editorTxtPane.setContentType("text/html");

    rendererPanel.add(initCellControls(rendererPanel, rendererLabel));
    rendererPanel.add(rendererTxtPane);

    editorPanel.add(initCellControls(editorPanel, editorLabel));
    JScrollPane sp = new JScrollPane(editorTxtPane);
    sp.setBorder(null);
    editorPanel.add(sp);

    editorTxtPane.addFocusListener(new FocusAdapter() {

        @Override
        public void focusGained(FocusEvent e) {
            super.focusGained(e);
            e.setSource(editorTxtPane);
            for (int i = editorFocusListeners.size() - 1; i >= 0; i--) {
                editorFocusListeners.get(i).focusGained(e);
            }
        }

        @Override
        public void focusLost(FocusEvent e) {
            super.focusLost(e);
            e.setSource(editorTxtPane);
            for (int i = editorFocusListeners.size() - 1; i >= 0; i--) {
                editorFocusListeners.get(i).focusLost(e);
            }
        }
    });
}

それは私のエディターとレンダラーのメソッドです:

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Comment c = data.get(row);
    rendererTxtPane.setText(c.getComment());
    return rendererPanel;
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    Comment c = data.get(row);
    c.setNeedSave(true);
    editorTxtPane.setText(c.getComment());
    return editorPanel;
}
4

2 に答える 2

1

これは、エディタとレンダラーがどのように機能するかではありません。特に、エディターはセルが編集されている間のみ有効です。各行の. 編集が完了すると、ここで説明されているように、モデルが改訂された で更新されます。あなたのやっていることを、 sscceの基礎となると比較することができます。TableModelDocumentDocument

于 2012-04-26T11:58:16.303 に答える
0

これは、次の 2 つの条件のいずれかの結果である可能性があります。

  1. リサイズ可能なコンポーネントに埋め込んでいるテキスト コンポーネントは、リサイズ メカニズムのプロセスを通じてシフト アウトされているため、リサイズすると、内部のテキスト コンポーネントが消えます。
  2. サイズ変更プロセスが発生するたびに、標準の Swing 再描画プロセスが適切なタイミングでプラットフォームによって呼び出されないため、コーディングを通じて手動で再描画を呼び出すことができます。通常、SWING プラットフォームは、全体的な GUI の変更に気付くたびに repaint メソッドを自動的に呼び出しますが、他のプロセスが完了した後に実行されるようにスケジュールされているため、この場合、repaint を手動で呼び出すことは避けられません。
于 2012-04-26T10:15:46.627 に答える