java - 如何限制 JDialog 的尺寸
问题描述
我正在研究一个JDialog
子类(我们称之为PendenciesDialog
),它向用户显示任意数量的大小相等、垂直堆叠JPanel
的 s(最少一个)以及它们下方的关闭按钮。JDialog
除了构建和打包它、向用户显示并让他们关闭对话框之外,不涉及任何交互。
这些JPanel
s 显示了有关个人每月付款未决的一些信息,例如帐户名称、未决状态和付款管理系统的可点击链接。我认为我们不需要关心它们是如何构建的。
现在我的问题。我想将JDialog
固定的宽度保持在屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半,或者如果挂件数量很少或只有一个,则更短。如果我无法通过调整JDialog
(例如通过覆盖JDialog
'sgetXXXSize()
方法)来实现这一点,我可以调整它的子组件。我不确定我需要做什么。
为了构建JDialog
我已经将其布局管理器设置为BoxLayout
对齐PAGE_AXIS
,然后添加 aJScrollPane
以支持 a JPanel
(让我们称之为 thisJPanel
的引用变量pendenciesPanel
),然后添加一个关闭按钮。这JPanel
也有一个对齐的BoxLayout
经理,PAGE_AXIS
并且将包含各个 pendency JPanel
s(实际上由于大小相等的要求,我认为它实际上应该是 a GridLayout
)。
如果挂件的数量太大而无法适应's(或's )最大高度,我打算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;
}
}
}
推荐阅读
- javascript - 使用 css 使画廊响应式
- javascript - 如何在 react-native 样式的组件中使用不透明度?
- node.js - 使用 ssh2shell node.js 为多个设备执行多个命令
- flutter - 有没有办法让动画弧颤动?
- python - 仅当我按下 alt 按钮时才会绘制 Tkinter 小部件
- javascript - 如何定义正确的接口并在 React 中循环数据?
- automation - 使用 Automation Anywhere 到达 Google 表格中具有值的最后一个单元格
- excel - 格式化 - 导出为 PDF - Excel VBA
- javascript - 从 mongodb 获取数据时,节点 js javascript 中的 Map.get() 总是返回 undefined
- python - 当给定两个数字在python中给出余数0时,我想打印一些东西。下面的代码是为了演示我想要的,但它没有用