JPanel和JScrollPane只有垂直滚动

时间:2016-05-04 21:12:54

标签: java swing

我有兴趣创建一个动态接收按钮的容器。当它到达容器宽度时,按钮放在第一行按钮的下方,并且必须显示垂直滚动条。虽然它不能显示水平滚动条,但容器可以水平调整大小。举个例子: enter image description here

点击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:当添加按钮时,我无法找到重新绘制面板的方法,如果你知道的话,也请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

您在面板中使用FlowLayout。 FlowLayout不会重新计算面板的首选大小。由于首选大小永远不会改变,因此垂直滚动条将永远不会出现。

这就是您需要在面板上使用WrapLayout的原因。

您定义了WrapLayout变量但实际上从未在面板上使用WrapLayout

另外,我不知道你为什么使用GroupLayout这么简单。框架的默认布局管理器是BorderLayout。只需使用面板创建滚动窗格,然后将滚动窗格添加到BorderLayout.CENTER。然后将包含该按钮的其他面板添加到BorderLayout.PAGE_END。它的两行代码。了解如何创建自己的GUI并且不依赖于IDE生成的复杂代码。

  

添加按钮时,我无法找到重新绘制面板的方法,如果你知道的话,也请告诉我。

从可见GUI添加(或删除)组件时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();