java - 动态地将固定高度面板添加到 JScrollPane

标签 java swing jpanel jscrollpane

JPanel panel = new JPanel(new GridLayout(0,1));
JScrollPane contentpane = new JScrollPane(panel);
JButton add  = new JButton("ADD");
add.actionListener(new ActionListener() {
     public void actionPerformed(){
          MyPanel newpanel = new MyPanel("title","Button"); //MyPanel is a class which extends JPanel and contains constructor MyPanel(String TitleToSet ,String ButtonTitleTOAdd)
           panel.add(newpanel);
           panel.repaint(); 
     }) ;

我使用此代码认为它将动态地将 MyPanel 添加到网格布局中,并且如果添加更多“MyPanel”,“面板”将是可滚动的。然而,情况并非如此,第一个“MyPanel”填充了整个“面板”,并且在添加第二个“MyPanel”时(通过单击“添加”按钮),第一个“MyPanel”被缩小以为添加第二个“MyPanel”腾出空间。并且在添加更多时,所有“MyPanel”都适合视口(viewport)而不是使“面板”可滚动。如何动态添加这些“MyPanel”并在添加更多“MyPanel”时使“面板”可滚动?任何帮助将不胜感激。

最佳答案

http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html :

By default JScrollPane uses ScrollPaneLayout to handle the layout of its child Components. ScrollPaneLayout determines the size to make the viewport view in one of two ways:

  1. [...]
  2. getPreferredSize is used.

您应该添加该行

panel.setPreferredSize(new Dimension(0, panel.getComponents().size() * SUB_PANEL_HEIGHT));

到你的 ActionListener。

完整示例:

package main;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;

class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(400, 400));
        frame.setSize(400, 400);
        
        JPanel panel = new JPanel(new GridLayout(0, 1));
        panel.add(new JLabel("BOO"));
        panel.add(new JButton("BBBB"));
        
        JScrollPane contentpane = new JScrollPane(panel);
        frame.add(contentpane);
        
        new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JPanel newpanel = new JPanel();
                newpanel.add(new JLabel("LOL"));
                panel.add(newpanel);
                System.out.println(100 * panel.getComponents().length);
                panel.setPreferredSize(new Dimension(0, 100 * panel.getComponents().length));
                contentpane.validate();
            }
        }).start();
        
        frame.setVisible(true);
    }
}

关于java - 动态地将固定高度面板添加到 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28807936/

相关文章:

java - 一个队列中的多个监听器 RabbitMQ Spring

java - java如何将int转boolean

java - Hibernate+swing 检查登录名/密码

java - JPanel 不显示添加的组件

java - 为什么这个 JPanel 不可见?

java - 在 RxJava 中调用 onNext 之间暂停

java - 使用用户名 token 保护 axis2

java - 如何将值(数组或数组列表)从一个 Pane 传递到另一个 Pane ?

java - jSpinner 时间选择器模型编辑

java - 我无法将按钮移至底部 - JFrame