Java滚动窗格/JPanel
我有一个JPanel,其中包含多个对象(自定义类扩展了JPanel)对象。JPanel有一个7行1列的网格布局。我试图将一个包含7个对象的JPanel添加到另一个JScrollPane中,这样我就可以滚动查看所有对象,但它做了一些奇怪的事情。无论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;
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)代码>