我有一个JFrame
包含了一组JPanels
在CardLayout
。每个JPanel
都有不同的大小,我希望JFrame
适应当前显示的大小JPanel
(而不是JPanel
适应的大小JFrame
)。
我该如何实现?
通常是:如果您遇到布局问题,请 始终 使用适当的LayoutManager解决它。 切勿 调整组件的大小提示以达到您的目标。
在这种情况下,调整CardLayout特别容易。默认情况下,它将其prefSize计算为所有卡的prefSizes的最大值。只需子类化并实现以返回当前可见卡的prefSize(加上插图)即可:
public static class MyCardLayout extends CardLayout {
@Override
public Dimension preferredLayoutSize(Container parent) {
Component current = findCurrentComponent(parent);
if (current != null) {
Insets insets = parent.getInsets();
Dimension pref = current.getPreferredSize();
pref.width += insets.left + insets.right;
pref.height += insets.top + insets.bottom;
return pref;
}
return super.preferredLayoutSize(parent);
}
public Component findCurrentComponent(Container parent) {
for (Component comp : parent.getComponents()) {
if (comp.isVisible()) {
return comp;
}
}
return null;
}
}
使用该方法(借用@mKorbel的示例),主要方法完全缩小了:
private static void createAndShowUI() {
final CardLayout cardLayout = new MyCardLayout();
final JPanel cardHolder = new JPanel(cardLayout);
final JFrame frame = new JFrame("MultiSizedPanels");
JLabel[] labels = {
new JLabel("Small Label", SwingConstants.CENTER),
new JLabel("Medium Label", SwingConstants.CENTER),
new JLabel("Large Label", SwingConstants.CENTER)};
for (int i = 0; i < labels.length; i++) {
int padding = 50 * (i + 1);
Border lineBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.blue),
BorderFactory.createEmptyBorder(padding, padding, padding, padding));
labels[i].setBorder(lineBorder);
JPanel containerPanel = new JPanel();
containerPanel.add(labels[i]);
cardHolder.add(containerPanel, String.valueOf(i));
}
JButton nextButton = new JButton("Next");
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.next(cardHolder);
frame.pack();
}
});
JPanel btnHolder = new JPanel();
btnHolder.add(nextButton);
frame.add(cardHolder, BorderLayout.CENTER);
frame.add(btnHolder, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
我有一个< code>JPanel到< code>JFrame中。我在< code>JPanel上加载了一张图片,但它只显示了图片的一部分:这是我所做的代码部分: 这就是它的样子: 完整的图片看起来像这样: 有没有办法将图片缩放到< code>JFrame的大小?预先感谢
下面是“DisplayImage”自定义面板相关部分的代码:
问题内容: 使用Java时,我发现启动应用程序时很难将主窗口放置在屏幕中央。 有什么办法可以做到吗?它不必垂直居中,水平对齐对我来说是更重要的目标。但是垂直对齐也是值得欢迎的。 问题答案: 我总是这样做: JFrame涉及哪里?
问题内容: 我正在生成一个文档,就像下面的代码一样,当然,表的内容是变化的。我需要做的是确保无论单元格中的内容量如何,该表的大小都不会超过一页。有办法吗? 编辑:@Bruno Lowagie。模板中包裹着图像的提示听起来很合适,我根据更改了代码,但是现在得到的只是一个空的PDF。我是在做错什么,还是这是完全错误的方法? 问题答案: 如果要使表格适合页面,则应在考虑页面大小之前创建表格,并像Tabl
我对JPanel和JFrame还是个新手,可能没有按照我应该的方式使用它们。我正在尝试创建Pong游戏,在创建JFrame并将JPanel添加到它之后,我可以调整JPanel的大小,但我不知道如何调整JFrame的大小以适应它。Game类扩展了JPanel。 主: 编辑: 将setSize更改为setPreferredSize,然后为JFrame调用pack()就可以解决所有问题。
问题内容: 我正在尝试使JFrame的可用内容区域恰好为500x500。如果我这样做 …我得到一个全尺寸为500x500的窗口(包括标题栏等),在这里,我确实需要一个尺寸约为504x520的窗口来说明窗口边框和标题栏。我该如何实现? 问题答案: 您可以尝试以下几种方法:1-骇客: 2或将JPanel添加到框架的内容窗格中,然后只需将JPanel的首选/最小尺寸设置为500X500,请调用pack(