JScrollPane中不设置它的滚动条的位置属性立即

问题描述:

我有一个JScrollPane显示JPanel,已添加到它(在BoxLayout.Y_AXIS布局,即垂直向下)小包含一些文字与标题和边框JPanel秒。JScrollPane中不设置它的滚动条的位置属性立即

当这个被创建,如果JScrollPane较大JPanel使用起来比可视,从而出现垂直滚动更多的空间,我JScrollPane不一定它的滚动设置为最高。

修复此问题包括设置JScrollPanelvalue属性,该属性是存储滚动距离的属性。但是,将元素添加到JScrollPane,然后将此JScrollPane添加到它所属的帧中后,其位置属性(如值,最大值,最小值)尚未设置,因此我无法将value设置为零因为它已经是零,在此之前意识到它不是零。

下面是我为创建问题而创建的一个小型评论程序。

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollBar; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.EtchedBorder; 
import javax.swing.border.TitledBorder; 

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

    public App() 
    { 
     // Making the main window. 
     JFrame window = new JFrame(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setSize(200, 200); 
     window.setLayout(
       new BoxLayout(window.getContentPane(), BoxLayout.Y_AXIS)); 

     // Making the JPanel that the scrollbox will be on. 
     JPanel scrollBoxPanel = new JPanel(); 
     scrollBoxPanel 
       .setLayout(new BoxLayout(scrollBoxPanel, BoxLayout.Y_AXIS)); 
     scrollBoxPanel.setMaximumSize(new Dimension(300, 500)); 

     // Making the JScrollPane. 
     JScrollPane listScroller = new JScrollPane(scrollBoxPanel); 

     // Making some panels of text. 
     JPanel smallPanel; 
     JTextArea textArea; 

     for (int i = 0; i < 3; i++) 
     { 
      smallPanel = new JPanel(); 
      smallPanel.setLayout(new BorderLayout()); 

      textArea = new JTextArea(
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fringilla, augue vitae venenatis venenatis, dui sapien suscipit libero, et malesuada quam odio vel sapien.\n"); 
      textArea.setLineWrap(true); 

      TitledBorder criticalPanelBorder = BorderFactory.createTitledBorder(
        BorderFactory.createEtchedBorder(EtchedBorder.RAISED), 
        "Box " + i, TitledBorder.LEFT, TitledBorder.TOP, 
        new Font(null, Font.BOLD, 14)); 
      smallPanel.setBorder(new CompoundBorder(criticalPanelBorder, 
        new EmptyBorder(5, 5, 5, 5))); 

      smallPanel.add(textArea); 
      scrollBoxPanel.add(smallPanel); 
     } 

     // Adding the JScrollPane to the window and displaying. 
     listScroller.validate(); 
     window.add(listScroller); 
     window.setVisible(true); 

     // Printing the attributes of the JScrollBar. Note that the value prints 
     // as 0, but is not zero in the program. 
     JScrollBar scrollBar = listScroller.getVerticalScrollBar(); 
     System.out.println("Value: " + scrollBar.getValue() + ", Max: " 
       + scrollBar.getMaximum() + ", Min: " + scrollBar.getMinimum()); 

    } 
} 

如何将滚动条的值设置为零?

如何将滚动条的值设置为零?

将代码包装在第二个SwingUtilities.invokeLater()中。这将确保代码在GUI构建完成后执行。

+0

作品,+1。 然而,这感觉有点像黑客。如果没有其他解决方案,我会接受这个答案,但理想情况下,我希望有一种方法可以立即设置值,而不需要等待所有其他AWT事件的处理,除非有一些编程GUI或Swing的方面,这表明这是面对这样的问题时做这种事情的标准方式? –

+0

@AlexW,很高兴帮助您,不要忘记通过点击对勾来“接受”答案,以便人们知道问题已经解决。 – camickr

+0

'我希望有一种方法可以立即设置值 - 是的,你试过打印值并且它是0,所以幕后代码并不总是按顺序工作,因为我们可能不会不理解,我们无能为力。你也许可以在周围玩耍并找到一些能够在适当的时间产生事件的监听者,但我只是随我所知。这是论坛中的常见解决方案,不仅适用于此,而且适用于其他情况。 – camickr