2012-10-23 161 views
0

我有一个gui,它有一个包含一系列标签和TextField并使用弹簧布局(这是mainPanel)和另一个包含按钮(buttonPanel)的Panel的面板。我想让我的mainPanel也有一个垂直滚动条。我想实现我的GUI,使得在JFrame中我有2个面板。 mainPanel出现在框架的顶部,buttonPanel出现在mainPanel的下面。将JPanel添加到JScrollPane

我的问题是我不能让面板出现,使buttonPanel在mainPanel下面,我也不知道如何添加一个滚动条到mainPanel。任何帮助,将不胜感激。

编辑:我能解决我关于JPanels的问题,现在我唯一的问题是我不能让我的mainPanel滚动。我已经添加了我的下面最近的代码:

这里是我的代码至今:

public static void main(String args[]) { 


      JFrame frame = new JFrame("SpringLayout"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      JScrollPane scroll = new JScrollPane(); 
      Container contentPane = frame.getContentPane(); 

      JButton next = new JButton("Next"); 
      JPanel buttonPanel = new JPanel(); 
      buttonPanel.add(next); 
      SpringLayout layout = new SpringLayout(); 
      JPanel mainPanel = new JPanel(); 
      mainPanel.setLayout(layout); 
      contentPane.setLayout(new BorderLayout()); 


      int j = 25; 
      for(int i =0;i<150;i++){ 
       JLabel label = new JLabel("Enter Name " + i); 
       JTextField text = new JTextField(15); 

      mainPanel.add(label); 
      mainPanel.add(text); 
      layout.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, 
          contentPane); 
      layout.putConstraint(SpringLayout.NORTH, label, j, SpringLayout.NORTH, 
          contentPane); 
      layout.putConstraint(SpringLayout.NORTH, text, j, SpringLayout.NORTH, 
          contentPane); 
      layout.putConstraint(SpringLayout.WEST, text, 20, SpringLayout.EAST, 
          label); 
      j+=30; 
      } 
      //mainPanel.setSize(500,800); 
      scroll.setPreferredSize(new Dimension(500,500)); 
      scroll.setViewportView(mainPanel); 
      contentPane.add(scroll); 
      contentPane.add(buttonPanel,BorderLayout.SOUTH); 
      //mainWindow.add(contentPane); 
      frame.setSize(500, 600); 
      frame.setVisible(true); 



     } 
+0

我觉得很好的问题+1 – mKorbel

回答

1

为了使它可以滚动,我只需要增加mainPanel的首选大小,使它比滚动条大。

public static void main(String args[]) { 
       JFrame frame = new JFrame("SpringLayout"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JScrollPane scroll = new JScrollPane(); 
       Container contentPane = frame.getContentPane(); 

       JButton next = new JButton("Next"); 
       JPanel buttonPanel = new JPanel(); 
       buttonPanel.add(next); 
       SpringLayout layout = new SpringLayout(); 
       JPanel mainPanel = new JPanel(); 
       mainPanel.setLayout(layout); 
       contentPane.setLayout(new BorderLayout()); 


       int j = 25; 
       for(int i =0;i<18;i++){ 
        JLabel label = new JLabel("Enter Name " + i); 
        JTextField text = new JTextField(15); 

       mainPanel.add(label); 
       mainPanel.add(text); 
       layout.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, 
           contentPane); 
       layout.putConstraint(SpringLayout.NORTH, label, j, SpringLayout.NORTH, 
           contentPane); 
       layout.putConstraint(SpringLayout.NORTH, text, j, SpringLayout.NORTH, 
           contentPane); 
       layout.putConstraint(SpringLayout.WEST, text, 20, SpringLayout.EAST, 
           label); 
       j+=30; 
       } 
       mainPanel.setPreferredSize(new Dimension(mainPanel.getWidth(), 1500)); 
       scroll.setPreferredSize(new Dimension(500,500)); 
       scroll.setViewportView(mainPanel); 
       contentPane.add(scroll); 
       contentPane.add(buttonPanel,BorderLayout.SOUTH); 
       //mainWindow.add(contentPane); 
       frame.setSize(500, 600); 
       frame.setVisible(true); 
     } 
0

这是我会怎么做:

public static void main(String args[]) { 
    JFrame frame = new JFrame("SpringLayout"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container contentPane = frame.getContentPane(); 

    JButton next = new JButton("Next"); 
    JPanel buttonPanel = new JPanel(); 
    buttonPanel.add(next); 
    GridBagLayout layout = new GridBagLayout(); 
    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(layout); 
    contentPane.setLayout(new BorderLayout()); 

    GridBagConstraints gbc = new GridBagConstraints(); 

    int j = 25; 
    for (int i = 0; i < 50; i++) { 
     JLabel label = new JLabel("Enter Name (" + i + ")"); 
     JTextField text = new JTextField(15); 

     gbc.gridx = 0; 
     gbc.gridy = i; 

     mainPanel.add(label, gbc); 

     gbc.gridx = 1; 
     mainPanel.add(text, gbc); 
    } 
    contentPane.add(new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); 
    contentPane.add(buttonPanel, BorderLayout.SOUTH); 
    frame.setSize(500, 800); 
    frame.setVisible(true); 
} 

一些修改: *使用GridBagLayout而不是SpringLayout(仅仅因为我不知道SpringLayout) *将您的mainPanel包装在JScrollPane中

看起来不舒服非常喜欢你的例子。 GridBagConstraints可以调整。

1
  • 我不能评论什么,试图在这一刻比较

  • 通知我不明白为什么SpringLayoutJFrame#pack()没有建立基于PreferredSize适当的GUI,颠簸这看起来像如(在这一刻)我的问题太

代码硬编码JFrame.setSize(),而不是正确的JFrame#pack()

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SpringLayout; 
import javax.swing.SwingUtilities; 

public class Main { 

    public Main() { 
     JFrame frame = new JFrame("SpringLayout"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton next = new JButton("Next"); 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(next); 
     SpringLayout layout = new SpringLayout(); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(layout); 
     int j = 25; 
     for (int i = 0; i < 5; i++) { 
      JLabel label = new JLabel("Enter Name"); 
      JTextField text = new JTextField(15); 
      layout.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, 
        mainPanel); 
      layout.putConstraint(SpringLayout.NORTH, label, j, SpringLayout.NORTH, 
        mainPanel); 
      layout.putConstraint(SpringLayout.NORTH, text, j, SpringLayout.NORTH, 
        mainPanel); 
      layout.putConstraint(SpringLayout.WEST, text, 20, SpringLayout.EAST, 
        label); 
      j += 30; 
      mainPanel.add(label); 
      mainPanel.add(text); 
     } 
     frame.add(mainPanel, BorderLayout.CENTER); 
     frame.add(buttonPanel, BorderLayout.SOUTH); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Main mn = new Main(); 
      } 
     }); 
    } 
}