如何限制 JDialog 的尺寸

How to limit the dimensions of a JDialog

我正在开发一个 JDialog 子类(我们称它为 PendenciesDialog),它向用户显示任意数量的大小相同、垂直堆叠的 JPanel(至少一个) 和它们下方的关闭按钮。除了构建 JDialog 并打包、向用户显示并让他们关闭对话框外,不涉及任何交互。

这些 JPanel 显示有关个人每月付款待决情况的一些信息,例如帐户名称、待决状态和可点击的 link 付款管理系统。我认为我们不需要关心它们是如何构建的。

现在是我的问题。我想将 JDialog 的宽度固定为屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半,或者如果悬垂数很少或只有一个,则更短。如果我无法通过调整 JDialog(例如,通过覆盖 JDialoggetXXXSize() 方法)实现这一点,我可以调整其子组件。不过我不确定我需要做什么。

为了构建 JDialog,我将其布局管理器设置为 BoxLayout,对齐方式为 PAGE_AXIS,然后向其添加了一个 JScrollPane,由 [=13= 支持](让我们称之为 JPanel 的引用变量 pendenciesPanel),然后添加一个关闭按钮。 JPanel 也有一个 BoxLayout 经理与 PAGE_AXIS 对齐,并将包含个人悬而未决的 JPanels(实际上由于相同大小的要求,我认为它实际上应该是 GridLayout).

我打算让 JScrollPane 显示 pendenciesPanel 的视口,并在挂起的数量太多无法容纳 JDialog(或 JScrollPane 的)最大高度。

那么根据这个描述,我该如何实现 JDialog 尺寸调整?从我读到的内容来看,最合适的方法似乎是重写它的 getXXXSize() 方法,例如:

private final Dimension SCREEN_DIMENSION = Toolkit.getDefaultToolkit().getScreenSize();

@Override
public Dimension getMaximumSize() {
    return new Dimension(SCREEN_DIMENSION.width / 2, SCREEN_DIMENSION.height / 2);
}

但我尝试覆盖 getMinimumSize()getPreferredSize()getSize() 等似乎不起作用,或者我实施错误。我需要调整它的内部子组件吗?或者只调整 JDialog 就足够了?如果是,怎么做?

我创建了一个简单的 GUI 来说明我的评论。这是 JFrame。

这是 JDialog。

这是完整的示例代码。您必须修改 createPendenciesPanel 方法以使其更加真实。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class JDialogTest implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JDialogTest());
    }

    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame("JDialog Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel());

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(
                150, 100, 150, 100));
        panel.setPreferredSize(new Dimension(400, 600));

        JButton button = new JButton("Open JDialog");
        button.addActionListener(new ButtonListener());
        panel.add(button);

        return panel;
    }

    public class ButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            new PendenciesDialog(frame, "Pendencies Dialog");
        }

    }

    public class PendenciesDialog  extends JDialog {

        private static final long serialVersionUID = 1L;

        public PendenciesDialog(JFrame frame, String title) {
            super(frame, true);
            
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setTitle(title);

            add(createMainPanel(frame));
            pack();
            setLocationRelativeTo(frame);
            setVisible(true);
        }
        
        private JPanel createMainPanel(JFrame frame) {
            JPanel panel = new JPanel(new BorderLayout());
            
            JPanel displayPanel = createDisplayPanel();
            JScrollPane scrollPane = new JScrollPane(displayPanel);
            panel.add(scrollPane, BorderLayout.CENTER);
            
            Dimension d = frame.getSize();
            Dimension p = displayPanel.getPreferredSize();
            panel.setPreferredSize(new Dimension(p.width + 50, d.height / 2));
            
            return panel;
        }
        
        private JPanel createDisplayPanel() {
            JPanel panel = new JPanel(new GridLayout(0, 1, 10, 10));
            panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            
            for (int i = 0; i < 6; i++) {
                panel.add(createPendenciesPanel());
            }
            
            return panel;
        }
        
        private JPanel createPendenciesPanel() {
            JPanel panel = new JPanel(new FlowLayout());
            panel.setBackground(Color.LIGHT_GRAY);
            panel.setPreferredSize(new Dimension(100, 200));
            
            return panel;
        }

    }
    
}