2016-11-15 84 views
1

我有這樣的代碼。我減少了所有的細節,但是按下一個按鈕後,這個文本區域會發生變化,它所做的只是改變文本區域。沒有滾動添加。我甚至試圖將滾動策略設置爲始終,但它返回一個錯誤。該面板將被添加到帶有BorderLayout.CENTER的另一個面板,然後該面板將被添加到JFrame中。如何將更改的JTextArea添加到JScrollPane?

public class Tester extends JFrame{ 
    JPanel panel = new JPanel(); 
    public static void main(String[] args) { 
     new Tester(); 
    } 
    public Tester(){ 
     setSize(1300, 700); 
     setTitle("A Bar Chart"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     panel(); 
     setVisible(true); 
    } 
    public void panel(){ 
     JTextArea text = new JTextArea(); 
     text.setPreferredSize(new Dimension(100, 100)); 
     JScrollPane pane = new JScrollPane(text); 
     JButton button = new JButton("a"); 
     button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      text.setText("asd\nasdasd\nasdasd\nasdasd\nasdasd\nasdasd\na\na\na\n"); 

     } 
     }); 
     panel.add(pane); 
     panel.add(button); 
     add(panel); 
    } 
} 

我想現在我只是想簡單一些。也許問題是,當我設置文本的大小不會改變,所以滾動不會出現。所以也許現在的問題是我如何讓滾動顯示或更改它的大小,使滾動顯示。

+0

'我砍倒所有details' - 是很好,直到問題得到解決,你不知道什麼細節是相關的。發佈一個證明問題的適當的[mcve]。這是一個帶有scrollpane,textarea和將數據添加到文本區域的按鈕的框架。僅當文本區域的首選大小大於滾動窗格的大小時,滾動纔會發生。 '這個面板將被添加到另一個面板與BorderLayout.CENTER' - 不需要面板。只需將滾動窗格直接添加到框架。 – camickr

+0

好的。我設法用簡單的代碼來模擬問題。 –

+0

這個[topic](http://stackoverflow.com/questions/13096045/adding-scrollpane-to-jtextarea)可能會幫助 – Squiddie

回答

3

你拍攝自己的腳有:

text.setPreferredSize(new Dimension(100, 100)); 

決不限制一個JTextArea的規模這樣,因爲它會導致你被限制首選大小,可JTextArea中看到,因爲這個問題當文本佔用更多空間時,可以適當擴展,然後選擇合適的大小。相反,設置JTextArea的列和行屬性,最簡單的方法是使用適當的構造函數。

JTextArea text = new JTextArea(TEXT_AREA_ROWS, TEXT_AREA_COLUMNS); 

例如,

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class Tester2 extends JPanel { 
    private static final int TA_ROWS = 30; 
    private static final int TA_COLS = 50; 
    private JTextArea text = new JTextArea(TA_ROWS, TA_COLS); 

    public Tester2() { 
     text.setFocusable(false); 
     JScrollPane scrollPane = new JScrollPane(text); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(new JButton(new ButtonAction("Press Me"))); 

     setLayout(new BorderLayout()); 
     add(scrollPane); 
     add(buttonPanel, BorderLayout.PAGE_END); 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction(String name) { 
      super(name); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < 80; i++) { 
       int wordsInSent = (int) (5 + 6 * Math.random()); 
       for (int j = 0; j < wordsInSent; j++) { 
        int wordLength = (int) (5 + 8 * Math.random()); 
        for (int k = 0; k < wordLength; k++) { 
         char c = (char) ('a' + (int)(Math.random() * ('z' - 'a'))); 
         sb.append(c); 
        } 
        sb.append(" "); 
       } 
       sb.append("\n"); 
      } 
      text.append(sb.toString()); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Tester2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Tester2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

是的,它的工作原理。出於某些原因,我以爲我嘗試過這種方式,但它不起作用,但也許我做了一些其他的錯誤。無論如何謝謝你。 –

+0

@TienanhNguyen:參見編輯文本區域中的隨機單詞 –