Java I';我很难让JScrollPanes真正显示滚动条
我在互联网上找到了一些例子,包括获取图像或文本框来显示滚动条,但它们都涉及一个程序,基本上在滚动窗格中显示其全部内容。我需要让它做的是在某个地方粘贴一个JPanel,在面板中堆积一堆文本、图标等,直到它对于我的空间来说太大,然后在它上滚动 我可能还需要能够对面板进行空布局,因为我可能迟早要手动定位面板中的内容 所以我试着制作一个非常简单的程序,在一个足够容纳两个人的空间中放置三个彩色块,并显示一个滚动条,让你向下滚动看到第三个。它没有添加滚动条 导入有点混乱和冗余,因为这是从几个不同的文件拼凑而成的,但它们不会产生任何错误Java I';我很难让JScrollPanes真正显示滚动条,java,swing,jscrollpane,jscrollbar,Java,Swing,Jscrollpane,Jscrollbar,我在互联网上找到了一些例子,包括获取图像或文本框来显示滚动条,但它们都涉及一个程序,基本上在滚动窗格中显示其全部内容。我需要让它做的是在某个地方粘贴一个JPanel,在面板中堆积一堆文本、图标等,直到它对于我的空间来说太大,然后在它上滚动 我可能还需要能够对面板进行空布局,因为我可能迟早要手动定位面板中的内容 所以我试着制作一个非常简单的程序,在一个足够容纳两个人的空间中放置三个彩色块,并显示一个滚动条,让你向下滚动看到第三个。它没有添加滚动条 导入有点混乱和冗余,因为这是从几个不同的文件拼凑而
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
public class ScrollDemo extends JFrame {
JScrollPane scrollpane;
public ScrollDemo() {
super("JScrollPane Demonstration");
setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
setVisible(true);
}
public void init() {
setLayout(null);
JPanel innerPanel = new JPanel();
JPanel outerPanel = new JPanel();
getContentPane().setBounds(0,0,800,600);
outerPanel.setBounds(400,0,400,400);
innerPanel.setBounds(0,0,600,600);
innerPanel.setLayout(null);
JPanel greenPanel = new JPanel();
JPanel yellowPanel = new JPanel();
JPanel bluePanel = new JPanel();
greenPanel.setBounds(0,0,200,200);
yellowPanel.setBounds(0,200,200,200);
bluePanel.setBounds(0,400,200,200);
greenPanel.setBackground(Color.GREEN);
yellowPanel.setBackground(Color.YELLOW);
bluePanel.setBackground(Color.BLUE);
innerPanel.add(greenPanel);
innerPanel.add(yellowPanel);
innerPanel.add(bluePanel);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(innerPanel);
scrollPane.setBounds(200,0,200,400);
add(scrollPane);
}
public static void main(String args[]) {
new ScrollDemo();
}
}
数字。我一发帖就意识到出了什么问题 由于innerPanel具有空布局,因此需要显式声明其首选大小
innerPanel.setPreferredSize(new Dimension(200,600));
修复它。更好的做法是,您应该利用布局管理器,让这些管理器为您完成计算零部件尺寸和放置的繁重工作。例如:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;
public class ScrollDemo2 extends JPanel {
public static final Color[] COLORS = {Color.green, Color.red, Color.blue};
private static final Dimension PANEL_SIZE = new Dimension(300, 300);
public ScrollDemo2() {
JPanel innerPanel = new JPanel(new GridLayout(0, 1));
for (int i = 0; i < COLORS.length; i++) {
JPanel colorPanel = new JPanel();
colorPanel.setPreferredSize(PANEL_SIZE);
colorPanel.setBackground(COLORS[i]);
innerPanel.add(colorPanel);
}
JScrollPane scrollPane = new JScrollPane(innerPanel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.getViewport().setPreferredSize(PANEL_SIZE);
int eb = 10;
setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
}
private static void createAndShowGui() {
ScrollDemo2 mainPanel = new ScrollDemo2();
JFrame frame = new JFrame("ScrollDemo2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
公共类ScrollDemo2扩展了JPanel{
公共静态最终颜色[]颜色={Color.green,Color.red,Color.blue};
专用静态最终尺寸面板尺寸=新尺寸(300300);
公共文件2(){
JPanel innerPanel=新的JPanel(新的GridLayout(0,1));
for(int i=0;i
在Swing中,儿童的大小和定位是布局经理的专属工作。选择一个支持您的需求的工具,作为最后的手段,实现一个高度专业化的工具。子级通过报告大小提示进行协作,因此实现任何自定义组件以在getXXSize方法中返回合理的值
当你感到一种不可抗拒的手动干预冲动时,至少让经理尽可能多地干预。在您的上下文中,这可能是接管定位,但让经理处理大小调整,特别是计算父级的大小调整提示。下面是一段代码片段,使用:
事实上,你真的应该仔细阅读并学习使用布局管理器。如果您这样做,您的Swing体验、GUI质量和可维护性将大大提高。有时我需要将图像或按钮放在一个完全任意的、不是数学上确定的位置。是的,但这通常是罕见的例外,而不是规则。您的代码似乎默认为空布局,对于Swing来说,这确实是一个不好的习惯。只要说:“.当你在Swing中似乎需要setXXSize时,你就做错了,这是一个空布局:-)就像@HovercraftFullOfEels已经说过的那样,不要这么做。“完全任意,…位置。”如果它是“一个位置”,那么它几乎不是任意的。(自定义/第三方)
XYLayout
可以处理这一点,它还应该处理可能出现在同一屏幕空间(层、重叠)中的组件分层和PLAF更改等。用于在屏幕上定位组件的任何逻辑都应该使用LayoutManager
,即使你自己实现了一个。
DragLayout layout = new DragLayout();
JComponent field = new JPanel(layout);
JComponent player = new JLabel("I'm moving around");
field.add(player);
player.setLocation(200, 200);
frame.add(new JScrollPane(field));
frame.pack();
frame.setVisible(true);