3

スクロールバーを表示するための画像やテキストボックスを取得するなど、インターネット上に散らばっている例をいくつか見つけましたが、それらはすべて、基本的にコンテンツ全体をスクロールペインに表示するプログラムを含んでいます。私がそれをするために必要なのは、JPanelをどこかに貼り付け、たくさんのテキストやアイコンなどを、私が持っているスペースに対して大きすぎるまでそのパネルに積み上げてから、それをスクロールすることです。

遅かれ早かれ手動でパネル内に物を配置する必要があるので、おそらくそのパネルもnullレイアウトできるようにする必要があります。

そこで、2つ分のスペースに3つの色付きブロックを配置し、下にスクロールして3つ目のブロックを表示できるスクロールバーを表示する非常に単純なプログラムを作成しようとしました。スクロールバーは追加されません。

インポートは少し混乱していて冗長です。これは、いくつかの異なるファイルからまとめられているためですが、エラーは発生していません。

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

3 に答える 3

4

レイアウト マネージャーを有利に使用し、これらのマネージャーにコンポーネントのサイズと配置の計算という面倒な作業を任せる方がよいでしょう。例えば:

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();
         }
      });
   }
}
于 2012-07-08T00:21:15.663 に答える
4

Swing では、子のサイズ変更と配置は LayoutManager の独占的な仕事です。最後の手段として、高度に専門化されたものを実装するため、要件をサポートするものを選択してください。子供たちはサイジングのヒントを報告することで協力するため、カスタム コンポーネントを実装して、getXXSize メソッドで妥当なものを返します。

手動で干渉したいという抑えきれない衝動を感じた場合は、少なくともマネージャーにできる限りのことをさせてください。あなたのコンテキストでは、ポジショニングを引き継ぐかもしれませんが、マネージャーにサイジングを処理させ、特に親のサイジングヒントを計算させます。Rob の DragLayoutを使用したコード スニペットを次に示します。

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);
于 2012-07-08T07:47:48.783 に答える
1

図。投稿してすぐに、何が悪いのかわかりました。

innerPanel には null Layout があるため、優先サイズを明示的に宣言する必要があります。

    innerPanel.setPreferredSize(new Dimension(200,600));

それを修正します。

于 2012-07-07T23:46:51.573 に答える