2013-11-20 34 views
1

我似乎碰到了一個替代JTextPane中的文本的障礙。我有幾個JTextPanes,我需要更改現有的文本。我可以用初始文本做到這一點,但當我打電話來改變文檔時,我看到了這個改變,但面板不會更新。如何替換JTextPane中的StyledDocument

switch(module.getCurrentQuestionNumber()) 
{ 
    case 1: 
     doc = module8.loadQuestion1(); 
     udoc = module8.loadQuestion1(); 

     codeTextPane.setDocument(doc); 
     uCodeTextPane.setDocument(udoc); 

     toolPane.add(module.loadQuestion1Panel(outputTextPane)); 
     uToolPane.add(module.loadQuestion1Panel(uOutputTextPane)); 
     break; 

    case 2: 
     doc = module8.loadQuestion2(); 
     udoc = module8.loadQuestion2(); 

     codeTextPane.setDocument(doc); 
     uCodeTextPane.setDocument(udoc); 

     toolPane.add(module.loadQuestion2Panel(outputTextPane)); 
     uToolPane.add(module.loadQuestion2Panel(uOutputTextPane)); 
     break; 
} 

module.getCurrentQuestionNumber()返回1時,面板加載並且一切按預期工作。當module.getCurrentQuestionNumber()返回2時,兩個doc & udoc中都有正確的信息(我跨過了程序,當我在情況2中接到調用時,docs顯示更新後的問題),但這不會更新codeTextPane,也不會toolPane加載新面板。我試圖調用repaint()和update(),兩者似乎都不起作用。我錯過了什麼嗎?

+0

確保你沒有從聽衆那裏做這件事。例如,如果你設置了一個'Listener',它在你按下按鈕時執行,但是當你仍然在監聽器中時運行上面的代碼,它可能不起作用。不過,我並不是100%確定我是對的。 – ajb

+0

我不是在一個監聽器中調用它。我從聆聽者的主gu中調用一種方法。基本上我希望能夠在單獨的類中構建獨立模塊,然後讓主GUI在被調用時顯示它們。我認爲這將是最好的方法。我在模塊中創建了樣式化的文檔,將它們返回給gui,並讓gui將它們顯示在jtextpane中。我將jtextpane嵌套在嵌套在jsplitpane內的jscrollpane內。我相信這是設置它的正確方法,但是一旦我寫入文本窗格,我無法使用新文檔更新它。 – jbolt

回答

1

我試圖調用repaint()和update()並且都不起作用。我錯過了什麼嗎?

當從可見的GUI添加(或刪除)組件的一般形式是:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

默認情況下,組件有一個大小爲零,所以你需要重新驗證()調用佈局管理器所以組件被分配一個大小。

+0

這似乎也沒有工作。我試圖創建一個全新的文檔(doc9),而不是使用從模塊返回的新樣式文檔重新分配doc8,但這也行不通。新數據存在於我需要將其分配給jtextpane的地方,但不會使用命令'codeTextPane.setDocument(doc8);' – jbolt

+0

更新我還嘗試先用'doc.remove( 0,doc.getLength());'調用來移除現有的文本,但這不起作用,這似乎很奇怪,因爲我錯過了難題的關鍵部分。創建窗格的調用是'公共JTextPane codeTextPane;',並使用'codeTextPane = new JTextPane();'創建。看看其他教程看起來應該起作用。 – jbolt

+0

@jbolt,最簡單的方法是在設計時創建JTextPane。然後你只要你有一個文本窗格的引用,你可以根據需要訪問和更新文檔。動態替換組件不是一個好主意。 – camickr