Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你的框架太高了吗?_Java_Swing_Jframe - Fatal编程技术网

Java 你的框架太高了吗?

Java 你的框架太高了吗?,java,swing,jframe,Java,Swing,Jframe,我试图创建一个简单的JavaSwingGUI,它由顶部的面板和中间的选项卡组成。我希望顶部面板保持其首选大小,选项卡占据剩余空间,因此我使用了边框布局。选项卡的内容可能很高,因此我将选项卡组件放在滚动窗格中 除了我的压缩帧太高了12像素(可能太宽了16像素)之外,一切似乎都按照我预期的方式工作(关于调整帧大小时的组件大小和滚动条行为)。请有人解释一下发生了什么事以及如何解决它。不知何故,当软件包调整所有组件的大小时,有些东西足够聪明(主要)尊重屏幕大小。我在Windows7上使用Java8,屏幕

我试图创建一个简单的JavaSwingGUI,它由顶部的面板和中间的选项卡组成。我希望顶部面板保持其首选大小,选项卡占据剩余空间,因此我使用了
边框布局
。选项卡的内容可能很高,因此我将选项卡组件放在滚动窗格中

除了我的压缩帧太高了12像素(可能太宽了16像素)之外,一切似乎都按照我预期的方式工作(关于调整帧大小时的组件大小和滚动条行为)。请有人解释一下发生了什么事以及如何解决它。不知何故,当软件包调整所有组件的大小时,有些东西足够聪明(主要)尊重屏幕大小。我在Windows7上使用Java8,屏幕分辨率为1920x1200

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

代码:

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]
输出:

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]

如果你打算用
setPreferredSize
到处乱跑,要做好准备,以免误入歧途

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

由于API的工作方式,
JScrollPane
将使用组件的
preferredSize
来确定其自身的大小。您可以通过实现该接口来改变这一点,该接口允许您返回
preferredScrollableViewportSize
,而
JScrollPane
在确定需要多大时将使用该接口


如果您进行一些搜索,您会看到
可滚动的
演示和许多其他地方

“centerPanel.setPreferredSize(新尺寸(8001300));”可能是一个问题,我认为,第一个面板的高度为150+10布局填充+1300(下面板+顶部和底部的框架镀铬)为1460+框架镀铬,大于屏幕高度。一旦GUI达到这些长度(或者更确切地说是高度),操作系统很可能会对其强制执行更合理的大小,所有赌注都没有了。对于一个比屏幕高度短的框架,同样的实验是如何进行的呢?我用300而不是1300来重试实验,中间面板的窗口大小变为816x518。根据上面的数学,这将表明框架铬是58像素。我认为这意味着你的理论可能是正确的(很可能是你所说的操作系统)将窗口高度剪裁到更合理的位置提示:添加@MadProgrammer(或者其他任何人,
@
很重要)通知此人新的评论。您的意思是重新考虑一般使用
setPreferredSize
,还是在中央面板的情况下特别使用?在我的测试项目中,我用它作为一种捷径,以实现符合我现实生活情况的目标。我尝试用一个循环来替换代码,该循环将100个标签添加到中心面板(使用100x1网格布局),得到了相同的结果(即,从不使用
设置PreferredSize
——一般来说,是的,确定这一点不是您的责任,而是组件。您是否实现了
可滚动
界面?您是否从
preferredScrollableViewportSize
返回了所需的大小?我担心从
preferredScrollableViewPort返回的大小大小
将创建一个固定大小的视口。但是,在试用了您最初链接到的示例后,它似乎只是一个起点。当我调整框架大小时,滚动窗格将按照我最初希望的方式适当拉伸。感谢您的帮助