2012-04-26 1 views
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; 
} 
+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

1

Это не как Editors and Renderers работа. В частности, редактор действует только во время редактирования ячейки. Ваш TableModel должен хранить каждую строку Document. После завершения редактирования ваша модель будет обновлена ​​с пересмотренным Document, как описано here. Вы можете сравнить, что вы делаете с example, которые могут стать основой вашего sscce.

0

Это может быть результатом одного из двух нижеприведенных условий:

  1. Текста компонент, который вы встраивание в вашем resisable компонента сдвигаются через процесс resising механизма, поэтому, когда вы resising его внутренний компонент текста исчезает
  2. Всякий раз, когда процесс resising происходит, стандартный процесс Swing не называет его платформой в нужный момент, поэтому вы можете переписать вызов вручную с помощью кодирования. SWING кроссплатформенные обычно вызывает метод перекрашивать автоматически всякий раз, когда он замечает изменения в общем GUI, но это schedulled быть запущена после того, как некоторые другие процессов для завершения, в этом случае вызывающего перекрашивать вручную является inevitble