2011-10-04 136 views
0

在下面的SSCCE中可以看到水平滚动条出现,即使可以使用垂直滚动条也是如此。这只是一个例子。我使用自己的LayoutManager而不是BoxLayout,但是如果你有解决方案,我可以在我自己的LayoutManager中使用它。当垂直滚动条可见时摆动BoxLayout水平滚动条

我已经尝试过实现Scrollable的自定义JPanel,然后覆盖TrackScrollableViewportWidth并返回true,但没有得到我想要的。那时文本在右边被切断了。

另一件事,那不是那么重要,但仍然让我恼火:如果增加窗口的宽度,水平滚动条就会消失,JTextArea的宽度也会增加。但是,如果您减小窗口的宽度,则JTextArea不会相应地调整其宽度。

在此先感谢。这里是SSCCE:

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.WindowConstants; 

public class MyFrame extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public static void main(final String[] args) 
    { 
     new MyFrame(); 
    } 

    private MyFrame() 
    { 

     setTitle("Scrollbars and width"); 
     setSize(800, 200); 
     setResizable(true); 
     setVisible(true); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     final JPanel container = new JPanel(); 
     final BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS); 
     container.setLayout(layout); 

     final JTextArea area1 = new JTextArea(); 
     area1.setText("1sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf "); 
     area1.setLineWrap(true); 
     area1.setWrapStyleWord(true); 
     area1.setEditable(false); 
     area1.setForeground(Color.RED); 
     container.add(area1); 

     final JTextArea area2 = new JTextArea(); 
     area2.setText("2sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf "); 
     area2.setLineWrap(true); 
     area2.setWrapStyleWord(true); 
     area2.setEditable(false); 
     area2.setBackground(Color.RED); 
     container.add(area2); 

     final JScrollPane scrollbox = new JScrollPane(container); 

     this.getContentPane().add(scrollbox, BorderLayout.CENTER); 

     this.getContentPane().invalidate(); 
     this.getContentPane().validate(); 

    } 
} 

回答

1

与BoxLayout无关,更改为一列GridLayout来验证。

原因是(很可能)是文本区域的一些奇怪的大小调整行为 - 它需要在执行真实事件(即由LayoutManager调整大小)之前将其纳入一些内部初始化中。添加一个虚拟的尺寸调用(在该地区的配置过程中的某个地方),确切的值是无关的

area1.setSize(1, Short.MAX_VALUE);