Java滚动窗格/JPanel

Java滚动窗格/JPanel,java,swing,jpanel,jscrollpane,Java,Swing,Jpanel,Jscrollpane,我有一个JPanel,其中包含多个对象(自定义类扩展了JPanel)对象。JPanel有一个7行1列的网格布局。我试图将一个包含7个对象的JPanel添加到另一个JScrollPane中,这样我就可以滚动查看所有对象,但它做了一些奇怪的事情。无论JPanel中有多少对象,滚动条都不会显示。有什么想法吗?提前谢谢 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension;

我有一个JPanel,其中包含多个对象(自定义类扩展了JPanel)对象。JPanel有一个7行1列的网格布局。我试图将一个包含7个对象的JPanel添加到另一个JScrollPane中,这样我就可以滚动查看所有对象,但它做了一些奇怪的事情。无论JPanel中有多少对象,滚动条都不会显示。有什么想法吗?提前谢谢

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;

    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;
    import javax.swing.ScrollPaneLayout;    

    public class Main {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
          JFrame frame = new JFrame("Test");
          frame.setLayout(new BorderLayout());

          JLabel title = new JLabel("Game", JLabel.CENTER);
          title.setPreferredSize(new Dimension(60,60));
          title.setBorder(BorderFactory.createLineBorder(Color.black,5));
          frame.add(title,BorderLayout.NORTH);

          frame.setSize(850,480);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          Grid g = new Grid(); 

          JPanel jp = new JPanel();
          jp.setLayout(new GridLayout(1,3));
          jp.add(g);

          JPanel test = new JPanel();         


          test.setLayout(new GridLayout(7,1));

          test.add(p1);
          test.add(p2);
          test.add(p3);
          test.add(p4);
          test.add(p5);
          test.add(p6);
          test.add(p7);
          JScrollPane jsp = new JScrollPane(test);
          jsp.setViewportView(test);
          jsp.getVerticalScrollBar().setUnitIncrement(50);
          jsp.setCorn
          jsp.setVerticalScrollBarPolicy(22);               

          jp.add(jsp,BorderLayout.EAST);    

          frame.add(jp);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
          }      
      }

jp JPanel使用JPanel的默认FlowLayout,这可能会阻止您调整JScrollPane的大小,并查看它是否实际正常工作。为什么不将JScrollPane添加到JFrame的contentPane中,或者让jp使用BorderLayout?另外,您不需要设置JScrollPane的viewportView,因为您已经在通过将“test”传递到其构造函数来进行设置了。

jp-JPanel使用JPanel的默认FlowLayout,这可能会阻止您调整JScrollPane的大小,并使其无法正常工作。为什么不将JScrollPane添加到JFrame的contentPane中,或者让jp使用BorderLayout?另外,您不需要设置JScrollPane的viewportView,因为您已经通过将“test”传递到其构造函数中来完成此操作。

您的代码不会编译。请看下面的代码。它可以垂直和水平滚动

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

class MyPanel extends JPanel {
    MyPanel(Color c) {
        setBackground(c);
    }
}

public class Test {
    public static void main(String[] args) {
        JPanel panel = new JPanel();
        // the size of this panel is larger than the frame
        panel.setPreferredSize(new Dimension(500, 2000));
        panel.setLayout(new GridLayout(7, 1));
        // add 7 sub panels
        panel.add(new MyPanel(Color.magenta));
        panel.add(new MyPanel(Color.cyan));
        panel.add(new MyPanel(Color.blue));
        panel.add(new MyPanel(Color.green));
        panel.add(new MyPanel(Color.yellow));
        panel.add(new MyPanel(Color.orange));
        panel.add(new MyPanel(Color.red));

        JScrollPane scroll = new JScrollPane(panel);
        scroll.setViewportView(panel);
        scroll.getVerticalScrollBar().setUnitIncrement(50);

        JFrame frame = new JFrame("Test");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scroll);
        frame.setVisible(true);
    }
}

您的代码无法编译。请看下面的代码。它可以垂直和水平滚动

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

class MyPanel extends JPanel {
    MyPanel(Color c) {
        setBackground(c);
    }
}

public class Test {
    public static void main(String[] args) {
        JPanel panel = new JPanel();
        // the size of this panel is larger than the frame
        panel.setPreferredSize(new Dimension(500, 2000));
        panel.setLayout(new GridLayout(7, 1));
        // add 7 sub panels
        panel.add(new MyPanel(Color.magenta));
        panel.add(new MyPanel(Color.cyan));
        panel.add(new MyPanel(Color.blue));
        panel.add(new MyPanel(Color.green));
        panel.add(new MyPanel(Color.yellow));
        panel.add(new MyPanel(Color.orange));
        panel.add(new MyPanel(Color.red));

        JScrollPane scroll = new JScrollPane(panel);
        scroll.setViewportView(panel);
        scroll.getVerticalScrollBar().setUnitIncrement(50);

        JFrame frame = new JFrame("Test");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scroll);
        frame.setVisible(true);
    }
}

我无法将JScrollPane添加到ContentPane,因为我不希望在使用ScrollPane时移动另一个JPanel。滚动窗格也可以工作,但我需要将添加的对象垂直堆叠在彼此的顶部。谢谢你的帮助。想法?如果视口视图大于滚动窗格的视口,滚动条将显示。我尝试添加更多对象以使滚动条显示,但它不会显示。请考虑创建并发布一个允许我们编译、运行、测试、,并修改您的代码。我无法将JScrollPane添加到ContentPane,因为我不希望在使用ScrollPane时另一个JPanel移动。滚动窗格也可以工作,但我需要将添加的对象垂直堆叠在彼此的顶部。谢谢你的帮助。想法?如果视口视图大于滚动窗格的视口,滚动条将显示。我尝试添加更多对象以使滚动条显示,但它不会显示。请考虑创建并发布一个允许我们编译、运行、测试、,修改你的代码。你太棒了……真的太棒了……我的代码现在运行得很好……我的代码正在编译……但我犯的错误是我只使用了一个面板将所有组件添加到框架中。。。。。谢谢你的帮助。现在,我如何才能在滚动窗格中向每个组件添加鼠标侦听器…?而不是
panel.add(new MyPanel(Color.magenta)),您编写了
MyPanel mp=newmypanel(Color.magenta);阿德穆塞利斯滕纳议员(…);面板。添加(mp)你太棒了……真的太棒了……我的代码现在运行得很好……我的代码正在编译……但我犯的错误是我只使用了一个面板将所有组件添加到框架中。。。。。谢谢你的帮助。现在,我如何才能在滚动窗格中向每个组件添加鼠标侦听器…?而不是
panel.add(new MyPanel(Color.magenta)),您编写了
MyPanel mp=newmypanel(Color.magenta);阿德穆塞利斯滕纳议员(…);面板。添加(mp)