如何限制 JDialog 的尺寸
How to limit the dimensions of a JDialog
我正在开发一个 JDialog
子类(我们称它为 PendenciesDialog
),它向用户显示任意数量的大小相同、垂直堆叠的 JPanel
(至少一个) 和它们下方的关闭按钮。除了构建 JDialog
并打包、向用户显示并让他们关闭对话框外,不涉及任何交互。
这些 JPanel
显示有关个人每月付款待决情况的一些信息,例如帐户名称、待决状态和可点击的 link 付款管理系统。我认为我们不需要关心它们是如何构建的。
现在是我的问题。我想将 JDialog
的宽度固定为屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半,或者如果悬垂数很少或只有一个,则更短。如果我无法通过调整 JDialog
(例如,通过覆盖 JDialog
的 getXXXSize()
方法)实现这一点,我可以调整其子组件。不过我不确定我需要做什么。
为了构建 JDialog
,我将其布局管理器设置为 BoxLayout
,对齐方式为 PAGE_AXIS
,然后向其添加了一个 JScrollPane
,由 [=13= 支持](让我们称之为 JPanel
的引用变量 pendenciesPanel
),然后添加一个关闭按钮。 JPanel
也有一个 BoxLayout
经理与 PAGE_AXIS
对齐,并将包含个人悬而未决的 JPanel
s(实际上由于相同大小的要求,我认为它实际上应该是 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;
}
}
}
我正在开发一个 JDialog
子类(我们称它为 PendenciesDialog
),它向用户显示任意数量的大小相同、垂直堆叠的 JPanel
(至少一个) 和它们下方的关闭按钮。除了构建 JDialog
并打包、向用户显示并让他们关闭对话框外,不涉及任何交互。
这些 JPanel
显示有关个人每月付款待决情况的一些信息,例如帐户名称、待决状态和可点击的 link 付款管理系统。我认为我们不需要关心它们是如何构建的。
现在是我的问题。我想将 JDialog
的宽度固定为屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半,或者如果悬垂数很少或只有一个,则更短。如果我无法通过调整 JDialog
(例如,通过覆盖 JDialog
的 getXXXSize()
方法)实现这一点,我可以调整其子组件。不过我不确定我需要做什么。
为了构建 JDialog
,我将其布局管理器设置为 BoxLayout
,对齐方式为 PAGE_AXIS
,然后向其添加了一个 JScrollPane
,由 [=13= 支持](让我们称之为 JPanel
的引用变量 pendenciesPanel
),然后添加一个关闭按钮。 JPanel
也有一个 BoxLayout
经理与 PAGE_AXIS
对齐,并将包含个人悬而未决的 JPanel
s(实际上由于相同大小的要求,我认为它实际上应该是 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;
}
}
}