java - 组件更改大小后文本消失

标签 java swing jtextpane jeditorpane

我在上面创建了一个 jTable 和 TableCellRenderer、TableCellEditor。我需要将可编辑的(具有文本/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;
}

最佳答案

不是 Editors and Renderers工作。特别是,编辑器仅在编辑单元格时有效。您的 TableModel 应该存储每一行​​的 Document。编辑结束后,您的模型将使用修改后的 Document 进行更新,如 here 所述.您可以将自己的工作与 example 进行比较,这可以构成你的基础 sscce .

关于java - 组件更改大小后文本消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10331298/

相关文章:

java - 如何设置按钮的大小?

java - 单向扩展 JTextPane

java - 静态 block 会在没有 main 方法的情况下执行吗?

java - JButton 在 JTextField 之前获得焦点

java - 如何标记 json 对象数组?

java - JList DefaultListModel ListSelectionListener

java.lang.IllegalArgumentException : Must be StyledEditorKit 异常

java - 如何强制 JTextPane 不转到下一行?

java - 在不打开应用程序的情况下使用通知操作更改 TextView 的文本

java - 工厂方法模式是模板方法模式的特例吗?