带有 JScrollPane 和 JPanel 的对话框为空

dialog empty with JScrollPane und JPanel

我正在尝试将内容添加到 mainPanel 并将 mainpanel 添加到 mainScrollPane。但是,会显示一个空对话框。

重要提示:必须使用 JPanel 和 JScrollPane 实现...

   `setModal(true);
    setTitle("Edit item");
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    JPanel mainPanel = new JPanel();
    mainPanel.setPreferredSize(new Dimension(400, 700));

    JScrollPane mainScrollPane = new JScrollPane();
    mainScrollPane.add(mainPanel);
    setLayout(new BorderLayout());
    add(mainScrollPane);

    mainPanel.add(new JLabel("ID: "));
    mainPanel.add(txtID = new JTextField(item.getID()));
    mainPanel.add(new JLabel("Description: "));
    mainPanel.add(txtDescription = new JTextField(item.getDescription()));


    pack();
    setVisible(true);`

谢谢大家

请提供一个最小的可重现示例。它可能如下所示:

MyFrame.java

import javax.swing.*;
import java.awt.*;

class Item { 
    String id; 
    String description; 
    Item(String id, String description) {this.id = id;this.description = description;}
    String getId() {return id;}
    String getDescription() {return description;}
}

public class MyFrame extends JFrame {
    Item item = new Item("007", "Special watch");
    public MyFrame() {
        // setModal(true);
        setTitle("Edit item");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setPreferredSize(new Dimension(400, 700));

        mainPanel.add(new JLabel("ID: "));
        mainPanel.add(new JTextField(item.getId()));
        mainPanel.add(new JLabel("Description: "));
        mainPanel.add(new JTextField(item.getDescription()));

        /* From Oracle's documentation, see link below: 
           Creates a JScrollPane that displays the contents of the
           specified component, where both horizontal and vertical
           scrollbars appear whenever the component's contents are
           larger than the view.
        */
        JScrollPane mainScrollPane = new JScrollPane(mainPanel);

        // Just to show the bars
        mainScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
        mainScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);  

        getContentPane().add(mainScrollPane); // <- This makes it shine!

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new MyFrame();
    }
}
$ javac MyFrame.java
$ java MyFrame   

瞧瞧:

https://docs.oracle.com/javase/8/docs/api/javax/swing/JScrollPane.html

IMPORTANT: it must be implemented with JPanel and JScrollPane...

JScrollPane mainScrollPane = new JScrollPane();
mainScrollPane.add(mainPanel);

您不应将组件直接添加到滚动窗格。相反,您需要将组件添加到滚动窗格的 viewport

这可以通过使用来完成:

JScrollPane mainScrollPane = new JScrollPane(mainPaneol);
//mainScrollPane.add(mainPanel);

JScrollPane mainScrollPane = new JScrollPane();
//mainScrollPane.add(mainPanel);
mainScrollPane.setViewportView(mainPanel);

滚动窗格随后会像您的代码当前所做的那样添加到框架中。

请注意,您不会注意到滚动窗格的使用,因为目前没有理由显示滚动条。所以真的没有必要使用滚动面板,直接把面板加到frame上就可以了。