我的JScrollPane不会在我的JPanel上垂直滚动

问题描述:

我有一个代码,我有很多'嵌套'的布局。边界,流程,在我的主程序中我有一个GridBag。我将面板动态添加到一个面板,并将其大小设置为使每个元素都垂直添加,但不会向上或向下滚动。我在网上看了一下,发现了类似的东西,但只让我的水平滚动,而不是像我想要的那样垂直滚动。这是我写的测试代码:我的JScrollPane不会在我的JPanel上垂直滚动

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

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class Main { 

    public Main() { 
     JFrame frame = new JFrame("Blah"); 

     Font font = new Font("Sans-Serif", Font.BOLD, 30); 

     JPanel memoryPanel = new JPanel(); 
     memoryPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     //memoryPanel.setPreferredSize(new Dimension(80 * 4, 55 * 9)); 

     JScrollPane s = new JScrollPane(memoryPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9)); 

     for (int i = 0; i <= 10; i++) { 

      JPanel nextPanel = new JPanel(); 
      nextPanel.setLayout(new BorderLayout()); 
      nextPanel.setBackground(Color.CYAN); 
      nextPanel.setForeground(Color.BLACK); 

      JPanel labelPanel = new JPanel(); 
      labelPanel.setLayout(new BorderLayout()); 

      JPanel buttonPanel = new JPanel(); 
      buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 0)); 

      JLabel label = new JLabel(); 
      label.setText("" + i); 
      label.setPreferredSize(new Dimension(80 * 4, 55)); 
      label.setHorizontalAlignment(JLabel.RIGHT); 
      label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); 

      JButton button1 = new JButton("A"); 
      JButton button2 = new JButton("B"); 
      JButton button3 = new JButton("C"); 

      label.setFont(font); 
      labelPanel.add(label); 

      buttonPanel.add(button1); 
      buttonPanel.add(button2); 
      buttonPanel.add(button3); 

      nextPanel.add(labelPanel, BorderLayout.PAGE_START); 
      nextPanel.add(buttonPanel, BorderLayout.PAGE_END); 

      memoryPanel.add(nextPanel, 0); 
      memoryPanel.revalidate(); 
      memoryPanel.repaint(); 
     } 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(s); 
     frame.setResizable(false); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Main(); 
    } 
} 

该注释行显示了水平滚动条。它没有评论,它没有显示任何。不知道我是否使用了错误的布局,但我一直试图修复它几个小时。我添加的行是s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));这是一切水平,而不是垂直。不知道如何解决这个问题。建议?

+1

's.getViewport创建一个实现了Scrollable接口的自定义类,并返回相应的值( ).setPreferredSize(新维(80 * 4,55 * 9));'是尝试和改变的错误。 'viewport'显示“视图”的一部分,它的大小实际上应该是'JScrollPane'的大小(减去滚动条) – MadProgrammer

+1

我也摆脱了'frame.setResizable(false);'和'memoryPanel.setPreferredSize (new Dimension(80 * 4,55 * 9));'并且让窗口实际上将它自己包装在内容中 – MadProgrammer

从摆脱s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));开始。您不希望更改视图端口的大小,它是您的内容的容器,并充当显示组件可见部分的“窗口”。

ScrollPane

接下来,摆脱frame.setResizable(false);,这将现在允许包实际上收拾围绕内容的窗口。由于您使用的是FlowLayout,因此这会使窗口与屏幕一样宽。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class Main { 

    public Main() { 
     JFrame frame = new JFrame("Blah"); 

     Font font = new Font("Sans-Serif", Font.BOLD, 30); 

     JPanel memoryPanel = new JPanel(); 
     memoryPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     //memoryPanel.setPreferredSize(new Dimension(80 * 4, 55 * 9)); 

     JScrollPane s = new JScrollPane(memoryPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     //  s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9)); 

     for (int i = 0; i <= 10; i++) { 

      JPanel nextPanel = new JPanel(); 
      nextPanel.setLayout(new BorderLayout()); 
      nextPanel.setBackground(Color.CYAN); 
      nextPanel.setForeground(Color.BLACK); 

      JPanel labelPanel = new JPanel(); 
      labelPanel.setLayout(new BorderLayout()); 

      JPanel buttonPanel = new JPanel(); 
      buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 0)); 

      JLabel label = new JLabel(); 
      label.setText("" + i); 
      label.setPreferredSize(new Dimension(80 * 4, 55)); 
      label.setHorizontalAlignment(JLabel.RIGHT); 
      label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); 

      JButton button1 = new JButton("A"); 
      JButton button2 = new JButton("B"); 
      JButton button3 = new JButton("C"); 

      label.setFont(font); 
      labelPanel.add(label); 

      buttonPanel.add(button1); 
      buttonPanel.add(button2); 
      buttonPanel.add(button3); 

      nextPanel.add(labelPanel, BorderLayout.PAGE_START); 
      nextPanel.add(buttonPanel, BorderLayout.PAGE_END); 

      memoryPanel.add(nextPanel, 0); 
      memoryPanel.revalidate(); 
      memoryPanel.repaint(); 
     } 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(s); 
     //  frame.setResizable(false); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

如果你想影响滚动视图区域的大小,那么你就需要根据自己的需要

+0

'frame.setResizable'与'pack()'的功能无关。它只是确定最终用户是否可以调整窗口大小。 – VGR

+0

@VGR真的,为什么窗口的大小超出了我的屏幕大小,并没有显示滚动条,当它被设置,当它不是,根据我的屏幕的宽度,并显示滚动条.. 。 - 个人,我避免'setResizable',它会导致更多的问题,然后它解决 – MadProgrammer

+0

@VGR与'setResizable(false)'框架大小是'3524x110',没有它,帧大小为'1920x110' - 所以我会比如说'setResizable'对'pack'的工作方式有影响 – MadProgrammer