打包的JFrame太高了?

时间:2017-04-21 11:51:06

标签: java swing jframe

我正在尝试创建一个简单的Java Swing GUI,它由顶部的面板和中心的选项卡组成。我希望顶部面板保持其首选大小,并使标签占据剩余空间,因此我使用了BorderLayout。选项卡的内容可能很高,因此我将选项卡组件放入滚动窗格。

一切似乎都按照我期望的方式工作(关于组件大小调整和滚动条行为,当我调整框架大小时),除了我的打包帧是12像素太高(可能16像素太宽)。有人请解释发生了什么以及如何解决它。不知怎的,当包正在调整所有组件的大小时,某些东西足够聪明(主要)尊重屏幕尺寸。我在Windows 7上使用Java 8,屏幕分辨率为1920 x 1200.

下面是我的测试代码及其产生的输出。

代码:

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public final class SizeTest
{
    public static void main(final String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGui();
            }
        });
    }

    private static void createAndShowGui()
    {
        final JPanel topPanel = new JPanel();
        topPanel.setBorder(BorderFactory.createTitledBorder("Top"));
        topPanel.setPreferredSize(new Dimension(800, 150));

        final JPanel centerPanel = new JPanel();
        centerPanel.setBorder(BorderFactory.createTitledBorder("Center"));
        centerPanel.setPreferredSize(new Dimension(800, 1300));

        final JScrollPane scrollPane = new JScrollPane(centerPanel);

        final JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Tab", scrollPane);

        final JPanel mainPanel = new JPanel(new BorderLayout(0, 10));
        mainPanel.add(topPanel, BorderLayout.NORTH);
        mainPanel.add(tabbedPane, BorderLayout.CENTER);

        final JFrame mainFrame = new JFrame("Size Test");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(mainPanel);
        mainFrame.pack();

        System.err.println("***** Frame Size: " + mainFrame.getSize() + ", Screen Size: "
            + Toolkit.getDefaultToolkit().getScreenSize() + ", Maximum Window Bounds: "
            + GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds());

        mainFrame.setVisible(true);
    }
}

输出:

***** Frame Size: java.awt.Dimension[width=816,height=1212], Screen Size: java.awt.Dimension[width=1920,height=1200], Maximum Window Bounds: java.awt.Rectangle[x=0,y=0,width=1920,height=1156]

1 个答案:

答案 0 :(得分:0)

如果您要使用setPreferredSize来解决问题,请做好准备让误入歧途的事情。

我要做的第一件事是使用setPreferredSize认真重新考虑。

由于API的工作方式,JScrollPane将使用组件的preferredSize来确定其自身的大小。您可以通过实施Scrollable界面来更改此设置,该界面允许您返回preferredScrollableViewportSizeJScrollPane将在确定需要的大小时使用Scrollable

如果您进行搜索,您会看到Class target = new Class(); PrivateObject obj = new PrivateObject(target); var retVal = obj.Invoke("PrivateMethod"); Assert.AreEqual(retVal); 已展示herehere以及许多其他地方