2016-11-15 33 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:参见编辑文本区域中的随机单词 –