首页 > 解决方案 > 如何限制 JDialog 的尺寸

问题描述

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

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

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

为了构建JDialog我已经将其布局管理器设置为BoxLayout对齐PAGE_AXIS,然后添加 aJScrollPane以支持 a JPanel(让我们称之为 thisJPanel的引用变量pendenciesPanel),然后添加一个关闭按钮。这JPanel也有一个对齐的BoxLayout经理,PAGE_AXIS并且将包含各个 pendency JPanels(实际上由于大小相等的要求,我认为它实际上应该是 a GridLayout)。

如果挂件的数量太大而无法适应's(或's )最大高度,我打算JScrollPane显示一个视口并提供滚动。pendenciesPanelJDialogJScrollPane

那么根据这个描述,我如何实现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就足够了?如果是这样,怎么做?

标签: javaswinglayoutjdialog

解决方案


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

JDialog 测试 GUI 1

这是JDialog。

JDialog 测试 GUI 2

这是完整的示例代码。您必须修改 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;
        }

    }
    
}

推荐阅读