2017-04-12 88 views
1

JTextArea有一个setColumns方法来设置最大列数,但JTextPane没有。当然,它可以在单个窗格中具有不同的字体,因此设置列数或行数并不完全合理。但是,当我在JScrollPanesetText内创建一个包含JTextPane的对话框时,它将变为整个屏幕宽度和单行,这是我想要防止的。限制JTextPane在JScrollPane中的大小

setMaximumSize似乎没有影响,不建议在任何速率(见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?)。

+0

甲的JTextPane将自动换行。您使用的布局管理器将根据框架中可用的空间确定滚动窗格的大小。发布你的[mcve]来证明问题。 – camickr

+0

检查此:http://stackoverflow.com/questions/39455573/how-to-set-fixed-width-but-dynamic-height-on-jtextpane/39466255#39466255 – Sharcoux

回答

2

我的当前的解决方案,这似乎相当难看,是从JTextArea实施延伸JTextPane,借用代码:当线路长度比滚动面板的视口的宽度更大

textArea = new JTextPane() { 
    int maxWidth; 
    int rowHeight; 

    void init(Font font) { 
     FontMetrics fontMetrics = getFontMetrics(font); 
     maxWidth = fontMetrics.charWidth('M') * 80; 
     rowHeight = fontMetrics.getHeight(); 
    } 

    { 
     initFont(getFont()); 
    } 

    @Override 
    public void setFont(Font font) { 
     init(font); 
     super.setFont(font); 
    } 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     Dimension base = super.getPreferredSize(); 
     Insets insets = getInsets(); 
     int width = Math.min(maxWidth, base.width) + insets.left + insets.right; 
     int estimatedRows = Math.max(1, (int) Math.ceil(base.getWidth()/maxWidth)); 
     int height = estimatedRows * rowHeight + insets.top + insets.bottom; 
      return new Dimension(width, height); 
    } 
}; 
+2

是的,这是适当的方法来覆盖if你想建议一个滚动窗格的首选大小。然后布局经理可以使用这些信息。 – camickr