java - 我无法让 JScrollPanes 实际显示滚动条

标签 java swing jscrollpane jscrollbar

我在互联网上发现了一些例子,涉及获取图像或文本框来显示滚动条,但它们都涉及一个基本上在滚动 Pane 中显示其全部内容的程序。我需要让它做的是在某处粘贴一个 JPanel,将一堆文本、图标等堆到该面板中,直到它对于我为它准备的空间来说太大了,然后滚动它。

我可能还需要能够对该面板进行空布局,因为我可能迟早要手动在其中放置内容。

所以我尝试制作一个非常简单的程序,将三个彩色 block 放在一个足够容纳两个的空间中,并显示一个滚动条,让您向下滚动以查看第三个。它不添加滚动条。

导入有点困惑和多余,因为这是从几个不同的文件拼凑而成的,但它们不会产生任何错误。

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();
  }
}

最佳答案

更好的做法是使用布局管理器发挥自己的优势,让这些管理器为您完成计算组件尺寸和位置的繁重工作。例如:

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 - 我无法让 JScrollPanes 实际显示滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379533/

相关文章:

java - 联系人列表 Swing

java - hibernate 和 mysql 带有 create-drop 选项,控制台输出显示错误...但 ddl 执行正常;可能的错误?

java - log4j2 的 Slack 附加程序

java - 需要有关 JComboBox 上的 itemStateChanged 的​​帮助

java - 动态更改 JFreeChart 直方图颜色?

java - JScrollPane 不可见

java - 面板为什么不绘制(paint)?

java - 为什么 JTable 滚动占用这么多内存?

Java jbutton 不可见

JScrollPane 中的 Java JPanel?