2016-12-20 17 views
1

スイングを使用してスクロール可能なパネルを作成しようとしています。しかし、私がスイングするのが新しいので、私はそうすることに失敗しています。私のコードでは、jScrollablePaneの中に何も表示されません。Java Swing - スクロール可能なパネル

jframeを作成し、jScrollablePaneを内部に入れました。 というUIElementというクラスを作成しました。これは、コンポーネントセクションと子セクションを含むjPanelに拡張されています。子セクションは他のUIElementで構成されます。

  • が前のUIElement下に置かれるべきすべてののUIElement。縦リストのように。
  • 子どもは、のコンポーネントの下に置く必要があります。
  • チャイルドセクションはスクロールできず、その高さは子UIElementsの高さの合計に固定されます。
  • コンポーネントの高さは固定されていますが、幅はコンテナによって延長できますが、
  • スペーサーの幅は、スペーサーから除いて40
  • に固定する必要があり、すべてのものの幅が動的です。
  • UIElementさんは0人以上の子供を持つことができます。

これはいくつかの写真の例ですが、幅は動的です。

enter image description here

そして、ここのコードです:

public abstract class UIElement extends JPanel { 
    public static final int DESIREDHEIGHT = 40; 

    JPanel componentsPanel, childPanel; 

    public UIElement() { 
     super(); 
     this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); 
     this.setBackground(Color.BLACK); 

     // componentsPanel 
     componentsPanel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       Dimension d = super.getPreferredSize(); 
       d.setSize(d.getWidth(),DESIREDHEIGHT); 
       return d; 
      } 

      @Override 
      public Dimension getMaximumSize() { 
       Dimension d = super.getMaximumSize(); 
       d.setSize(d.getWidth(),DESIREDHEIGHT); 
       return d; 
      } 

      @Override 
      public Dimension getMinimumSize() { 
       Dimension d = super.getPreferredSize(); 
       d.setSize(d.getWidth(),DESIREDHEIGHT); 
       return d; 
      } 
     }; 
     componentsPanel.setLayout(new BoxLayout(componentsPanel,BoxLayout.X_AXIS)); 
     componentsPanel.setBackground(Color.BLUE); 
     this.add(componentsPanel); 

     // child panel 
     childPanel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       float height = 0; 
       for (Component c: super.getComponents()) 
        height += c.getPreferredSize().height; 
       Dimension d = super.getPreferredSize(); 
       d.setSize(d.getWidth(),height); 
       return d; 
      } 

      @Override 
      public Dimension getMaximumSize() { 
       float height = 0; 
       for (Component c: super.getComponents()) 
        height += c.getMaximumSize().height; 
       Dimension d = super.getMaximumSize(); 
       d.setSize(d.getWidth(),height); 
       return d; 
      } 

      @Override 
      public Dimension getMinimumSize() { 
       float height = 0; 
       for (Component c: super.getComponents()) 
        height += c.getMinimumSize().height; 
       Dimension d = super.getMinimumSize(); 
       d.setSize(d.getWidth(),height); 
       return d; 
      } 
     }; 
     childPanel.setLayout(new BoxLayout(childPanel,BoxLayout.Y_AXIS)); 
     childPanel.setBackground(Color.RED); 

     // parent for childPanel and spacer 
     JPanel childParent = new JPanel(); 
     childParent.setLayout(new BoxLayout(childParent,BoxLayout.X_AXIS)); 

     // spacer 
     JPanel spacer = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT); 
      } 

      @Override 
      public Dimension getMaximumSize() { 
       return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT); 
      } 

      @Override 
      public Dimension getMinimumSize() { 
       return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT); 
      } 
     }; 
     spacer.setBackground(Color.RED); 
     childParent.add(spacer); 
     // add the childPanel later 
     childParent.add(childPanel); 
    } 


    @Override 
    public Dimension getPreferredSize() { 
     Dimension c = componentsPanel.getPreferredSize(); 
     Dimension d = childPanel.getPreferredSize(); 
     return new Dimension(c.width, c.height + d.height); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     Dimension c = componentsPanel.getMaximumSize(); 
     Dimension d = childPanel.getMaximumSize(); 
     return new Dimension(c.width, c.height + d.height); 
    } 

    @Override 
    public Dimension getMinimumSize() { 
     Dimension c = componentsPanel.getMinimumSize(); 
     Dimension d = childPanel.getMinimumSize(); 
     return new Dimension(c.width, c.height + d.height); 
    } 

} 

答えて

1

getPreferredSize()(または最大/ミニムサイズ)をオーバーライドしないでください:

public static void scrollable(String title) { 
    //Create and set up the window. 
    JFrame frame = new JFrame(title); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setSize(500,GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height); 

    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS)); 
    mainPanel.setBackground(Color.WHITE); 

    mainPanel.add(new UIElement()); 

    JScrollPane scrollPane = new JScrollPane(mainPanel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
    frame.getContentPane().add(scrollPane); 

    //Display the window. 
    frame.setVisible(true); 
} 

そしてここのUIElementクラスがありますパネルの

各パネルは、パネルのレイアウトマネージャーとパネルに追加されたコンポーネントに基づいて優先サイズを決定します。

パネルがレイアウトマネージャを使用する場合は、これらのメソッドをオーバーライドする必要はありません。レイアウトマネージャを持たないカスタムコンポーネントに対しては、getPreferredSize()メソッドをオーバーライドするだけで済みます。 Swingの用語では、これはJButton、JTextField、JLabelなどです。

カスタムコンポーネントを作成する場合は、サイズを設定します。他のコンポーネントを保持するレイアウトマネージャを持つコンテナとしてコンポーネントを使用するだけの場合は、サイズを計算しません。

+0

https://docs.oracle.com/javase/tutorial/uiswing/layout/problems。html - "fix"という語を検索する – ossobuko

+0

getPreferredSize()メソッドのすべての上書きを消去しました。 – ossobuko

+0

@ossobuko、適切なサイズを定義する必要がある「カスタムコンポーネント」についての私の意見は忘れました。使用しているすべてがJPanelsの場合は、階層の最下部にあるカスタムパネルに適切なサイズが必要です。 BoxLayoutを使用するように見える階層の中間のパネルは、サイズの計算を無効にするべきではありません。 – camickr

関連する問題