JScrollPane 不适用于 JPanel

JScrollPane does not work on JPanel

我有一个包含主面板的框架。最后一个将动态添加其他 commandPanel(每个包含一个按钮和一个 textField)。问题是即使 mainPanel 已满,JScrollPane 似乎也不允许我使用看不见的 commandPanel。 下图是我的案例。

为了初始化 window 我写了下面的代码:

frame = new JFrame();
frame.setBounds(100, 100, 962, 639);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null); 

mainPanel = new JPanel();
mainPanel.setBounds(264, 6, 692, 500);
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));    

scroll = new JScrollPane();
scroll.getViewport().add(mainPanel);
frame.getContentPane().add(scroll); 

动态添加新命令面板的方法是:

public void loadCommandPanel(String commandName)
{
    CommandPanel newCommandPanel = new CommandPanel();
    newCommandPanel.getCommandBtn().setText(commandName);   
    mainPanel.add(newCommandPanel);

    scroll.getViewport().add( newCommandPanel );
    mainPanel.add( scroll, BorderLayout.EAST);
    frame.add( mainPanel);

    ...
}

任何获得 scrollPane 的帮助,将不胜感激。

scroll.getViewport().add(mainPanel); 不是您使用 JViewportJScrollPane 的方式;相反,你应该使用这样的东西: scroll.getViewport().setView(newCommandPanel);

scroll.setViewportView(newCommandPanel);

查看 How to Use Scroll Panes 了解更多详情。

另请注意,这没有意义:

CommandPanel newCommandPanel = new CommandPanel();
newCommandPanel.getCommandBtn().setText(commandName);   
mainPanel.add(newCommandPanel);

scroll.getViewport().add( newCommandPanel );

您将 newCommandPanel 添加到 mainPanel,然后立即将其添加到另一个容器(尽管不正确)。

一个组件只能驻留在一个父组件上;当你将它添加到另一个容器时,它会自动从以前的容器中删除。

我做了一些修改,现在可以完美运行了。对于那些想要同样东西的人,这是我的代码:

import ...

public class mainUserInterface {

private JFrame frame;
private JPanel mainPanel;
private  JPanel commandsPanel;
private JScrollPane commandsScrollPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                mainUserInterface window = new mainUserInterface();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public mainUserInterface() {
    initialize();
}

private void initialize() {

    frame = new JFrame("CommandsExecutor");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setPreferredSize(new Dimension(1000, 700));

    mainPanel = new JPanel(new BorderLayout(5,5));
    mainPanel.setBorder( new TitledBorder("") );


    commandsPanel = new JPanel();
    commandsPanel.setLayout(new BoxLayout(commandsPanel, BoxLayout.Y_AXIS));

    for(int i=0; i<15;i++){

        commandsPanel.add(new CommandPanel());
    }

    commandsScrollPane = new JScrollPane(commandsPanel);
    mainPanel.add(commandsScrollPane,BorderLayout.CENTER);


    frame.setContentPane(mainPanel);
    frame.pack();
    frame.setVisible(true);
}
}

这是命令面板class:

import ...
public class CommandPanel extends JPanel {

private JTextField commandResult;
private JButton commandBtn;

public CommandPanel()
{
    this.setLayout( new BorderLayout(10,10));
    this.setBorder( new TitledBorder("Command:") );
    this.setMaximumSize(new Dimension(692,60));
    this.setMinimumSize(new Dimension(692,60));


    commandBtn = new JButton("Execute");
    commandBtn.setMaximumSize(new Dimension(137, 34));
    commandBtn.setMinimumSize(new Dimension(137, 34));
    this.add(commandBtn, BorderLayout.WEST);

    commandResult = new JTextField();
    commandResult.setMaximumSize(new Dimension(518, 34));
    commandResult.setMinimumSize(new Dimension(518, 34));
    this.add(commandResult, BorderLayout.CENTER);
}

public JTextField getCommandResult() {
    return commandResult;
}

public JButton getCommandBtn() {
    return commandBtn;
}

public void setCommandResult(JTextField commandResult) {
    this.commandResult = commandResult;
}

public void setCommandBtn(JButton commandBtn) {
    this.commandBtn = commandBtn;
}
}

感谢所有回答我问题的人,这真的很有帮助。