2014-08-19 1 views
0

У меня есть несколько JScrollPane s, содержащий один JTextArea. JTextArea s заполнены списком переменных, которые постоянно обновляются.Держите JScrollPane такой же длины java

У меня есть ScheduledExecutorService, который постоянно очищает JTextArea s и заменяет переменные. Для большинства JScrollPan es изменения очень бесшовные, и похоже, что номера, содержащиеся в списках, меняются плавно.

Это должно быть JScrollPane, что вызывает проблемы. Он будет постоянно выдавать вспышку (текстовая область и полоса прокрутки исчезают и снова появляются), которые я сопоставляю с тем, что она перекрашивается (я должен отметить, что, хотя другие панели обновляются так же, они не сталкиваются с этой проблемой). Полоса прокрутки также будет прокручиваться дико (назад к началу); все в целом выглядят очень грязно. Этот конкретный JScrollPane также является самым длинным, поэтому я предполагаю, что это причина. Ничего другого в этой области нет от других.

Если кто-то имеет лучшее решение, я полагаю, что мой лучший вариант, чтобы установить каретку на NEVER_UPDATE, но для того, чтобы это работало, JScrollPane бы оставаться такой же размер, даже когда я обнулить из всего текста.

Кто-нибудь знает, как это сделать? Чтобы уточнить, я не хочу, чтобы панель больше, я хочу, по существу, иметь возможность прокручивать вниз до заданной длины, даже если панель пуста.

ответ

2

Я не уверен, что это то, что вы ищете, но в прошлом я создал JTextPane, которая постоянно обновлялась сообщениями об исключениях, каждый из которых кодировался цветом. У него была панель прокрутки и буфер размера текста, поэтому, когда она была достигнута, она с самого начала удалит количество текста, добавленного в конец.

Каждый раз, когда я поймал исключение, я побежал это:

printExceptionMessage(new TCException(ex)); 

Что в свою очередь:

protected void printExceptionMessage(final TCException exception) { 

    SwingUtilities.invokeLater(
     new Runnable() { 
      public void run() { 

       Date recordDate = exception.getTimeStamp(); 
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z"); 
       String recordTime = sdf.format(recordDate); 

       String message = "(" + recordTime + ") EXCEPTION: " + exception.getMessage() + "\n"; 

       statusColorTextPane.setEditable(true); 

       // trim the textPane to the buffer size 
       Document doc = statusColorTextPane.getStyledDocument(); 
       int overLength = doc.getLength() + message.length() - Foo.TEXT_BUFFER_SIZE; 

       if (overLength > 0) { 
        try { 
         doc.remove(0, overLength); 
        } catch (Exception ex) { 

         System.err.println("Error occured while trimming the textPane."); 
         ex.printStackTrace(); 
        } 
       } 
       statusColorTextPane.append(Color.red, message); 
       statusColorTextPane.setEditable(false); 
      } 
     });  
} 

В этом случае statusColorTextPane является расширенным классом JTextPane. Она нуждается в этих двух методов в нем:

public void appendNaive(Color c, String s) { // naive implementation 

    SimpleAttributeSet aset = new SimpleAttributeSet(); 
    StyleConstants.setForeground(aset, c); 

    int len = getText().length(); 
    setCaretPosition(len); // place caret at the end (with no selection) 
    setCharacterAttributes(aset, false); 
    replaceSelection(s); // there is no selection, so inserts at caret 
} 

и

public void append(Color c, String s) { // better implementation--uses StyleContext 

    StyleContext sc = StyleContext.getDefaultStyleContext(); 
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, 
            StyleConstants.Foreground, c); 

    int len = getDocument().getLength(); // same value as getText().length(); 
    setCaretPosition(len); // place caret at the end (with no selection) 
    setCharacterAttributes(aset, false); 
    replaceSelection(s); // there is no selection, so inserts at caret 
} 

Foo.TEXT_BUFFER_SIZE для меня поставили на 20000.

 Смежные вопросы

  • Нет связанных вопросов^_^