2013-02-23 125 views
4

我是Java新手,刚刚在StackOverflow中找到了这段代码:ResizeTextArea更改JTextPane的大小

我想用JTextPane代替JTextArea。在JTextPane中,没有setRows()方法来改变行数。任何帮助,将不胜感激。

+0

* “我想用的JTextPane代替的JTextArea” *为什么呢?还要注意,这两个类名都以大写字母“J”开头。请停止“像你的IDE一样说话”并放置*正确的*名称。 – 2013-02-23 11:25:50

+0

什么设施?下面的垃圾回答的答案假设你想要不同高度的线。我想也许你想使用不同颜色的线条的文本窗格,在这种情况下,文本窗格的字体可用于计算线条高度。你提供的信息越多,答案就越好。 – camickr 2013-02-23 20:46:03

回答

8

StyledDocument中各条线的高度可能会有所不同,因此限制JTextPane中的概念没有用。您可以使用将滚动窗格的视口的首选大小限制为主面板大小的一些有用部分,如here及以下所示。

附录:正如@camickr评论的那样,覆盖JScrollPane中的getPreferredSize()有点容易。我还更新了代码以将增长限制为当前大小的一小部分:/。

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

/** 
* @see https://stackoverflow.com/a/15042241/230513 
* @see https://stackoverflow.com/a/14858272/230513 
*/ 
public class LimitTextPaneSize { 

    private static final int SIZE = 200; 
    private static final double LIMIT = 1/3d; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 

    private static void display() { 
     final JPanel mainPanel = new JPanel(new BorderLayout(5, 5)); 
     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     JPanel topPanel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(SIZE, SIZE); 
      } 
     }; 
     final JTextPane chatArea = new JTextPane(); 
     final JScrollPane scrollPane = new JScrollPane(chatArea){ 
      @Override 
      public Dimension getPreferredSize() { 
       Dimension d = super.getPreferredSize(); 
       int desired = (int) (mainPanel.getSize().height * LIMIT); 
       int limit = Math.min(desired, d.height); 
       return new Dimension(SIZE, limit); 
      } 
     }; 
     chatArea.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      private void updateSize() { 
       mainPanel.revalidate(); 
      } 
     }); 
     mainPanel.add(topPanel, BorderLayout.CENTER); 
     mainPanel.add(scrollPane, BorderLayout.SOUTH); 

     JFrame f = new JFrame("LimitTextPaneSize"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(mainPanel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+1

+1,有趣的做法。我想知道为什么你选择重写JViewport?当您重写JScrollPane的getPreferredSize()方法时,代码似乎工作。由于您不需要setViewport()方法,因此使用起来会稍微简单一些。 – camickr 2013-02-23 21:01:46

+1

@camickr:你是对的!感谢您的评论;代码已更新。 – trashgod 2013-02-24 02:52:44

+0

@trashgod:感谢您的帮助,您的回答非常有用。 – user2049371 2013-02-24 05:16:29