2015-07-02 68 views
2

我有一个JPanel滚动条,我想添加很多JLabels它。但滚动条不起作用。我无法使用滚动条,即使面板已满,它也不会滚动。这里是我的代码:JAVA JScrollPane没有显示

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 


public class Scroll { 
public static void main(String[] args) { 
    JPanel panel = new JPanel(new GridLayout(0,1)); 
    JPanel p = new JPanel(new BorderLayout()); 
    JScrollPane scroll = new JScrollPane(panel); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    p.add(scroll, BorderLayout.NORTH); 
    JButton but = new JButton("OK"); 
    p.add(but, BorderLayout.SOUTH); 
    but.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      panel.add(new JLabel("Some random text")); 
      scroll.revalidate(); 
      p.repaint();p.revalidate(); 
     } 
    }); 
    JFrame frame = new JFrame(); 
    frame.setSize(800,200); 
    frame.setVisible(true); 
    frame.add(p); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
} 
} 
+0

不是你的问题的答案,但它似乎你想在这里使用'JList' – Reimeus

+0

这就是对的。谢谢:) – Ben

回答

0

你的问题似乎与你的布局经理。当你不使用BorderLayout.CENTER位置时,我认为BorderLayout的行为很奇怪。我改了行

p.add(scroll, BorderLayout.NORTH); 

p.add(scroll, BorderLayout.CENTER); 

然后,以使文本从上而不是居中出现,我改变了布局管理器面板构件到的BoxLayout。来源:

JPanel panel = new JPanel(new GridLayout(0, 1)); 

JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

这似乎已经给了我想要的功能。让我知道这是否可以解决您的问题!

+0

谢谢你。有用 ! – Ben

0

如上所述,您应该使用JListJTable来实现您的用例。

关于这个问题,这是因为除的CENTER所有BorderLayout限制将扩大到尽可能多的空间及其部件占据,即使这意味着他们将扩大了屏幕边界的(你的情况NORTH部分扩展到每个按钮点击后南方)。

为了解决这个问题,明确指定了可以无限增长的组件的首选大小,如果你把它们添加到非中央面板与BorderLayout

scroll.setPreferredSize(new Dimension(-1, 100)); 

我用-1这里的width指示(我可以使用任何其他值)并不重要,因为无论如何它都会被布局管理器忽略(BorderLayout.NORTH组件被水平拉伸以获取所有可用的水平空间)。