Java 如何使JPanel可滚动?
我正在为我的大学项目创建GUI,并试图了解Java 如何使JPanel可滚动?,java,swing,jscrollpane,Java,Swing,Jscrollpane,我正在为我的大学项目创建GUI,并试图了解JScrollPane是如何工作的 我已经成功地编写了以滚动方式显示图片的简单程序: public class ScrollPaneTest{ public static void main(String[] args){ JFrame testFrame = new JFrame("ramka testowa"); testFrame.setDefaultCloseOperation(JFrame.EXIT_ON
JScrollPane
是如何工作的
我已经成功地编写了以滚动方式显示图片的简单程序:
public class ScrollPaneTest{
public static void main(String[] args){
JFrame testFrame = new JFrame("ramka testowa");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
JScrollPane scrollPane = new JScrollPane(picture);
testFrame.add(scrollPane, BorderLayout.CENTER);
testFrame.setSize(400, 400);
testFrame.setVisible(true);
}
}
尽管如此,在我的最终GUI中,我只想将JScrollPane
应用于它的一部分,例如singleJPanel
。为了验证这一想法,我编写了以下代码,但不幸的是,这些代码不起作用:
public class ScrollPaneTest{
public static void main(String[] args){
JFrame testFrame = new JFrame("ramka testowa");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
JScrollPane scrollPane = new JScrollPane(picture);
JPanel insidePanel = new JPanel();
insidePanel.add(scrollPane);
testFrame.add(insidePanel, BorderLayout.CENTER);
testFrame.setSize(400, 400);
testFrame.setVisible(true);
}
}
我已经阅读了很多教程,以及Stack和CodeRanch的文章,但我仍然无法理解JScrollPane
是如何工作的。我怀疑,我的错误与指定要滚动的JPanel
-的维度有关,但我尝试的每一种方法都没有给我任何滚动条或图片
如果你能告诉我这个问题的正确解决方案,最重要的是,告诉我哪里错了,我将非常感激
JPanel
,而不是JScrollPane
JPanel
添加到JScrollPane
,请执行以下操作:
scrollPane.setViewportView (panel)
JScrollPane
而不是JPanel
添加到JFrame
最简单的方法是创建JPanel并在创建JScrollPane时指定它:
JPanel myPanel = ...;
JScrollPane scroller = new JScrollPane( myPanel );
然后只需将滚动条添加到GUI(而不是添加myPanel)。问题似乎来自内部面板的默认
FlowLayout
。将它更改为另一个布局(我使用BordeLayout
),它应该可以工作。话虽如此,我无法解释为什么流布局失败
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class ScrollPaneTest {
public static void main(String[] args) {
JFrame testFrame = new JFrame("ramka testowa");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel picture = new JLabel(new ImageIcon(
new BufferedImage(370, 1200, BufferedImage.TYPE_INT_RGB)));
JScrollPane scrollPane = new JScrollPane(picture);
JPanel insidePanel = new JPanel(new BorderLayout());
insidePanel.add(scrollPane);
testFrame.add(insidePanel, BorderLayout.CENTER);
insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_START);
insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_END);
insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_START);
insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_END);
testFrame.pack();
testFrame.setSize(400, 400);
// failing to do this will end the main & the app.
// doing it will cause the EDT to start.
testFrame.setVisible(true);
}
}