[英]How to make JPanel scrollable?
我正在为我的大学项目创建GUI,而我正在努力了解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
仅应用于其中的一部分,例如单个JPanel
。 为了测试这个想法,我编写了以下代码,遗憾的是这些代码不起作用:
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
-to-scroll的维度有关,但我尝试的每一种方法都没有给我任何滚动条或根本没有图片。
如果你能告诉我这个问题的正确解决方案,最重要的是,告诉我我错在哪里,我将非常感激。
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.