2016-05-04 23 views
0

ボタンを動的に受け取るコンテナの作成に興味があります。それがコンテナの幅に達すると、ボタンはボタンの最初の行の下に置かれ、垂直スクロールバーを表示する必要があります。水平スクロールバーを表示することはできませんが、コンテナは水平方向にサイズ変更可能です。例: enter image description here縦スクロールのみのJPanelとJScrollPane

jbutton1をクリックすると、パネルのサイズに応じて新しいボタンが追加されます。この写真では、垂直スクロールバーを見ることができず、これが問題です。

私が使用したコードは怒鳴るいずれかです。

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package ScrollPanelTest; 

import java.awt.ComponentOrientation; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JScrollBar; 

/** 
* 
* @author leandro.lima 
*/ 
public class ScrollPane extends javax.swing.JFrame { 

    public int count = 1; 
    private WrapLayout layout = new WrapLayout(FlowLayout.LEADING, 5, 5); 

    /** 
    * Creates new form ScrollPane 
    */ 
    public ScrollPane() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jPanel1 = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton1.setText("jButton1"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     jPanel1.setBackground(new java.awt.Color(255, 255, 255)); 
     jPanel1.setMinimumSize(new java.awt.Dimension(0, 0)); 
     jPanel1.setPreferredSize(new java.awt.Dimension(0, 0)); 
     java.awt.FlowLayout flowLayout1 = new java.awt.FlowLayout(); 
     flowLayout1.setAlignOnBaseline(true); 
     jPanel1.setLayout(flowLayout1); 
     jScrollPane1.setViewportView(jPanel1); 
     jPanel1.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addComponent(jButton1) 
       .addContainerGap(327, Short.MAX_VALUE)) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jScrollPane1)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap(163, Short.MAX_VALUE) 
       .addComponent(jButton1)) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(jScrollPane1) 
        .addGap(34, 34, 34))) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     final JButton button = new JButton(); 
     button.setPreferredSize(new Dimension(100, 100)); 
     button.setSize(new Dimension(100, 100)); 

     button.setAction(new AbstractAction("<html><center><h4>Button " + (count++) + "</h4><br>Remove me</center></html>") { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       jPanel1.remove(button); 
       jPanel1.getRootPane().repaint(); 
       getContentPane().repaint(); 
      } 
     }); 

     jPanel1.add(button); 
     jPanel1.getRootPane().repaint(); 
     getContentPane().repaint(); 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) 
       if ("Windows".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { 

     } 
     //</editor-fold> 

     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ScrollPane().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    // End of variables declaration     
} 

OBS:私は、私をあまりにもご提示くださいボタンは、あなたが知っていれば、追加されているパネルを再描画する方法を見つけることができませんでした。

ありがとうございます!

答えて

3
jPanel1.setLayout(flowLayout1); 
    jScrollPane1.setViewportView(jPanel1); 

パネルでFlowLayoutを使用しています。 FlowLayoutは、パネルの推奨サイズを再計算しません。推奨サイズは決して変更されないので、垂直スクロールバーは決して表示されません。

これは、パネル上でWrapLayoutを使用する必要がある理由です。

変数WrapLayoutを定義しますが、実際にパネル上でWrapLayoutを使用することはありません。

また、GroupLayoutを使用する理由がわかりません。フレームのデフォルトのレイアウトマネージャは、BorderLayoutです。パネルでスクロールペインを作成し、スクロールペーンをBorderLayout.CENTERに追加するだけです。次にボタンを含む他のパネルをBorderLayout.PAGE_ENDに追加します。その2行のコード。独自のGUIを作成し、IDEによって生成される複雑なコードに依存しないようにしてください。

ボタンが追加されているときにパネルを再描画する方法が見つかりませんでした。ご存知の場合は、私にも表示してください。

追加(または削除)可視GUIのコンポーネント次に基本的なコードは次のとおり

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 
関連する問題