簡體   English   中英

打包JFrame太高?

[英]Packed JFrame Too Tall?

我正在嘗試創建一個簡單的Java Swing GUI,該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]

如果您打算使用setPreferredSize來解決問題,請為誤入歧途做好准備。

我要做的第一件事是認真考慮使用setPreferredSize

由於API的工作方式, JScrollPane將使用組件的preferredSize來確定其自身的大小。 您可以通過實現Scrollable接口來更改此設置,該接口允許您返回preferredScrollableViewportSizeJScrollPane在確定需要多大時將使用它。

如果您進行一些搜索,則會看到此處此處以及其他許多地方都展示 Scrollable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM