2012-06-12 48 views
0

嗨,我想创建一个JScrollPane,但它不会工作...我不知道为什么...这里是我的代码...JScrollPane的将无法工作

public class test extends JFrame{ 
    public test(){  
     setSize(1000,600); 

    } 

    private static JButton[] remove; 
    private static JPanel p = new JPanel(); 

    public static void main(String[]args){ 
     p.setLayout(null); 
     JFrame t=new test(); 
     remove = new JButton[25]; 
     for(int i=0;i<25;i++){ 
      remove[i]=new JButton("Remove"); 
      remove[i].setBounds(243,92+35*i,85,25); 
      p.add(remove[i]);  
     } 
     JScrollPane scrollPane = new JScrollPane(p); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     t.add(scrollPane); 
     t.setVisible(true); 
    } 

乌姆和林相当肯定框架是不够大,这25个按钮...但是,如果我删除该p.setLayout(null);一个水平滚动条将被自动创建...我真的不知道我的代码有什么问题... Pls非常感谢你!

+1

尝试调用['t.pack'](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack( ))。我还建议你找一个合适的['LayoutManager'](http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html)而不是使用'null LayoutManager','null LayoutManager's几乎总是一个坏主意。 – Jeffrey

回答

3

您需要设置p的preferredSize以使其工作。

p.setPreferredSize(new Dimension(800, 2000)); 

或者你可以具有P个扩展JPanel,然后重写的getPreferredSize()方法返回正确的尺寸。

我同意 - 摆脱你的空白布局。如果要正确使用Swing并具有健壮的Swing GUI,请了解并使用布局管理器。

例如,

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

public class Foo extends JFrame { 

    private static final int BUTTON_COUNT = 25; 

    public static void main(String[] args) { 
     JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, 20)); 
     btnPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     AbstractAction removeAction = new AbstractAction("Remove") { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      JButton src = (JButton) evt.getSource(); 
      JPanel container = (JPanel) src.getParent(); 
      container.remove(src); 
      container.revalidate(); 
      container.repaint(); 
     } 
     }; 
     for (int i = 0; i < BUTTON_COUNT; i++) { 
     JButton removeBtn = new JButton(removeAction); 
     btnPanel.add(removeBtn); 
     } 
     JPanel borderPanel = new JPanel(new BorderLayout()); 
     borderPanel.add(btnPanel, BorderLayout.NORTH); 
     JScrollPane scrollpane = new JScrollPane(borderPanel, 
      JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     scrollpane.setPreferredSize(new Dimension(400, 800)); 

     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(scrollpane); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
+0

哦,我以前试过GridLayout。据我记得,一个按钮只是填满整个电网不是吗?然而,如果我只是setLayout(null),我实际上可以把所有东西放在任何我想要的东西上......不知道:P哦,非常感谢你帮助我两次!我很感激,这里的每个人都愿意帮助谢谢! – b321234

+1

@ b321234:不要因为不了解如何完全使用它而丢弃工具。你可以亲眼看看你的布局如何让你失败。实验,学习,你会发现布局不可或缺。 –

+0

@ b321234:请参阅上面的编辑示例。 –

0

问题是滚动窗格检查其中的组件是“首选大小”,因此具有空布局的窗格的首选大小为(0,0)。它忽略了它。

你应该做的线沿线的东西:

p.setPreferredSize(1000,600); 

而且你应该会看到一些滚动条出现,我不知道他们会如何,虽然准确。

+0

错误。由于布局为空,setBounds方法将JButton的位置设置为参数中传递的伪矩形。换句话说,这些按钮在一列中。 – Vulcan

+0

@Vulcan:可能是正确的。 JScrollPane不能很好地处理使用视口视图的空布局。 –

+0

@HovercraftFullOfEels看起来乍得是指按钮的布局。 – Vulcan