【问题标题】:Java JPanel inside JScrollPane?JScrollPane 内的 Java JPanel?
【发布时间】:2012-03-12 16:52:36
【问题描述】:

我有一个 JFrame,在这个 JFrame 中我有一个 JPanel,我可以在上面进行绘制,这个 Panel 可以是任意大小,所以我将它放入一个 JScrollpane 中,以便在面板大于窗口屏幕大小时让我滚动。

不幸的是没有按我的预期工作:

  1. 使 JFrame 窗口小于 JPanel 大小不会显示滚动条

  2. JScrollPane 的大小现在似乎锁定到我添加到其中的 JPanel 的大小,与之前一样,它调整到它的 JFrame 窗口的边界(它仍然有点这样做,但现在只是垂直?!)

  3. 无论我为首选大小设置什么,JPanel 似乎都假定 JScrollpane 的大小

我确定我在做一些愚蠢的事情,如果有人能指出我将不胜感激!

JPanel imageCanvas = new JPanel(); // 'Canvas' to draw on
JScrollPane scrollPane = new JScrollPane();
    
// set size of 'canvas'
imageCanvas.setMinimumSize(new Dimension(100,100));

// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
scrollPane.setMinimumSize(new Dimension(50,50)); 
    
// Add a border to 'canvas'
imageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
    
scrollPane.setViewportView(imageCanvas);

【问题讨论】:

    标签: java swing jpanel jscrollpane layout-manager


    【解决方案1】:

    据我所知,有两种选择:

    有关详细信息,请参阅 Javadoc: http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

    【讨论】:

    • 嗨 Puce,感谢您的建议,原来我需要向 scrollView 添加一个“持有人”jPanel,然后给它一个布局管理器以获得所需的效果。
    【解决方案2】:
    • 在画布上设置首选大小。
    • 至少在我的电脑上增加尺寸 100,100 太小了。
    • 您可能想使用新的 GridLayout(1,1);如果您希望在展开框架时展开滚动窗格,则适用于 JFrame。

    【讨论】:

      【解决方案3】:

      setPreferredSize() 是诀窍,组件上的 setMinimumSize() 甚至 setSize() 都会被 JScrollPane 忽略。这是一个使用红色边框的工作示例。

      import java.awt.*;
      
      import javax.swing.*;
      
      public class Scroller extends JFrame {
      
          public Scroller() throws HeadlessException {
              final JPanel panel = new JPanel();
              panel.setBorder(BorderFactory.createLineBorder(Color.red));
              panel.setPreferredSize(new Dimension(800, 600));
      
              final JScrollPane scroll = new JScrollPane(panel);
      
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setLayout(new BorderLayout());
              add(scroll, BorderLayout.CENTER);
              setSize(300, 300);
              setVisible(true);
          }
      
          public static void main(final String[] args) throws Exception {
              SwingUtilities.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      new Scroller().setVisible(true);
                  }
              });
          }
      }
      

      【讨论】:

        【解决方案4】:
        // suggest a size of 'canvas'
        _ImageCanvas.setPreferredSize(new Dimension(100,100));
        
        // Scroll pane smaller then the size of the canvas so we should get scroll bars right?
        _ScrollPane.setPreferredSize(new Dimension(50,50)); 
        
        // ..later 
        _Frame.pack();
        

        【讨论】:

        • frame.pack();重新喜欢它。
        【解决方案5】:

        查看Scrollable 界面,这可能有助于解决大小问题。

        这两种方法可能有帮助:

        boolean getScrollableTracksViewportWidth();
        
        boolean getScrollableTracksViewportHeight();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-19
          • 1970-01-01
          • 2014-05-17
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          相关资源
          最近更新 更多