2010-12-12 49 views
4

我只是试图向我的TextField和TextArea添加垂直滚动条。 我正在使用ScrollPane,它应该默认创建垂直/水平滚动条。JScrollBar垂直/水平设置问题 - Java Swing

问题: 我需要一个垂直滚动条来查看不可见的数据。 在开始时会出现一个垂直滚动条,但是当数据增加时,垂直滚动条会变为水平滚动条。 此外,TextField消失,只有一个水平滚动条出现在它的位置。 我想这是因为我如何设置边界,但我试图改变边界,它最终完全废除了TextField。

我的代码片段:

public JTextField inputField = new JTextField(); 

public JTextArea talkArea = new JTextArea(); 

public JScrollPane inputFieldScroll = new JScrollPane(inputField); 

public JScrollPane talkAreaScroll = new JScrollPane(talkArea); 
     talkArea.setEditable(false); 

    talkArea.setBackground(Color.white); 

    talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));  

    this.getContentPane().add(talkAreaScroll, null); 

    //set input area 

     inputField.setBackground(Color.white); 

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT)); 

    inputFieldScroll.setVerticalScrollBar(new JScrollBar()); 

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT)); 

问:

有一些参数,我需要设置使之保持垂直滚动条? 当数据变成一条巨大的线时,为什么输入滚动条占据整个输入域?它在开始时显示为一个适当的垂直滚动条。

任何意见赞赏。

谢谢

+0

滚动条上一个JTextField? – khachik 2010-12-12 19:30:40

+0

您可以创建并发布一个小型可编译和可运行的示例吗?另外,如果您设置JScrollPane的JViewport的首选大小而不是JScrollPane本身,会发生什么情况? – 2010-12-12 19:32:06

回答

3

下面是我上面提到的一个小的可编译的代码片段。我同意camickr,你不应该使用绝对定位,而是使用布局管理器。如果您绝对需要JTextField的水平滚动条,那么使它成为工作的一种方式是让它始终显示,使用允许的JScrollPane构造函数。即,

 JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

对于例如

import java.awt.*; 
import javax.swing.*; 

public class FuSwing1b extends JPanel { 
    private static final int TA_ROWS = 25; 
    private static final int TA_COLS = 60; 
    private JTextField inputField = new JTextField(); 
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS); 

    public FuSwing1b() { 
     talkArea.setEditable(false); 
     talkArea.setFocusable(false); 
     talkArea.setBackground(Color.white); 
     //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT)); 

     JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     int gap = 10; 
     setLayout(new BorderLayout(gap, gap)); 
     add(talkPane, BorderLayout.CENTER); 
     add(inputPane, BorderLayout.SOUTH); 
     setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap)); 
    } 

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

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+2

)如果你想让srollbars正常工作,你不应该设置文本区域的首选大小。当文本区域的首选大小大于scrollpane的大小时会出现滚动条。文本区域,然后添加文本对其首选大小没有影响。 – camickr 2010-12-12 21:07:49

+0

感谢您的建议和更正!您当然是正确的。我将编辑上面的帖子来反映此。 – 2010-12-12 21:15:56

+0

嗨..我试过这个:(inputField,JScrollPane。 VERTICAL_SCROLLBAR_​​ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVER);设置为我的滚动窗格..但没有任何区别,当数据超出我的文本字段的大小时,结束了水平窗格:( – JJunior 2010-12-12 21:46:18

1

不要玩边界。使用布局管理器,您不必担心这一点。

当您创建的文本字段中是这样的:

JTextField textField = new JTextField(10); 

这将创建一个文本字段,将拥有至少10个字符。如果字符数超过文本字段的显示宽度,则使用右/左箭头键可以看到剩余的字符。这是我见过的所有应用程序使用的普通用户界面。不要尝试使用水平滚动条来创建自己的UI。用户不习惯这一点。

你可以使用它创建文本区域:

JTextArea textArea = new JTextArea(5, 30); 
JScrollPane scrollPane = new JScrollPane(textArea); 

创建具有5行的文本区域和每行约30个字符。

现在,使用布局管理器将文本字段和滚动窗格添加到您的框架,然后打包框架。布局经理将确定组件的最佳尺寸。向文本添加文本时,滚动条会自动出现在文本区域,文本超过5行。

+0

出于某种原因,我无法对您的回复进行投票。 ( – 2010-12-12 21:19:39