Java Swing-如何将我的应用限制为屏幕大小

Java Swing-如何将我的应用限制为屏幕大小,java,swing,window,screen,Java,Swing,Window,Screen,在我的应用程序中,我需要一个窗口来显示图像查看器,并具有以下大小限制: 如果图像很小,窗口会根据图像调整大小,而不显示滚动条 如果图像较大,窗口也会调整,但整个应用程序应在屏幕上保持可见,必要时在图像周围显示滚动条 目标是使图像上方和下方的UI保持可见 我为演示编写了以下代码,但对于大图像,应用程序总是比屏幕更大 你知道正确的方法是什么吗 import javax.swing.*; import java.awt.*; public class ScrollTest { priva

在我的应用程序中,我需要一个窗口来显示图像查看器,并具有以下大小限制:

  • 如果图像很小,窗口会根据图像调整大小,而不显示滚动条
  • 如果图像较大,窗口也会调整,但整个应用程序应在屏幕上保持可见,必要时在图像周围显示滚动条
目标是使图像上方和下方的UI保持可见

我为演示编写了以下代码,但对于大图像,应用程序总是比屏幕更大

你知道正确的方法是什么吗

import javax.swing.*;
import java.awt.*;

public class ScrollTest {
    private static final int IMG_WIDTH = 2000; // or 500
    private static final int IMG_HEIGHT = 2000; // or 500

    // Unsuccessful attempts:
    private static void limitAppSize(JFrame frame) {
        frame.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());
//        frame.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
        frame.pack();
    }

    public static void addComponentsToPane(Container container) {
        container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
        JPanel imagePanel = new JPanel() {
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                // Image replaced by a shape for demonstration purpose
                g2d.drawOval(0,0, IMG_WIDTH, IMG_HEIGHT);
            }
            public Dimension getPreferredSize() {
                return new Dimension(IMG_WIDTH, IMG_HEIGHT);
            }
            public Dimension getMaximumSize() {
                return new Dimension(IMG_WIDTH, IMG_HEIGHT);
            }
        };

        JScrollPane scrollableImagePanel = new JScrollPane(imagePanel);
        container.add(new JLabel("This would be a toolbar menu with multiple lines"));
        container.add(scrollableImagePanel);
        container.add(new JLabel("This would be a status bar"));
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("ScrollTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addComponentsToPane(frame.getContentPane());
        limitAppSize(frame);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGUI());
    }
}

框架将调整为屏幕大小,忽略任务栏的大小

要考虑任务栏,您可以使用:

frame.pack();

Dimension preferred = frame.getSize();
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
Rectangle bounds = env.getMaximumWindowBounds();

preferred.width = preferred.width > bounds.width ? bounds.width : preferred.width;
preferred.height = preferred.height > bounds.height ? bounds.height : preferred.height;

frame.setSize( preferred );

*“JPanel imagePanel=新JPanel(){..”为什么不改用
JLabel
呢?我倾向于认为JLabel用于标签,而jpanel用于普通面板,但我看到很多例子都将JLabel用作轻质面板。我承认我并不真正了解优点和缺点,但我想在这里提问会偏离主题,所以我会做我的家庭作业:-)。除非特别相关t表示大小调整问题?好的,明白了:JPanel是组件层次结构中的一个“分支”,可以包含子组件,JLabel是一个“叶”在组件树中,因此更轻。这正是我所需要的!谢谢。我试图给布局管理器提供提示,以便它自己找到正确的大小,但只需自己计算最小值并使用setSize()强制它当然是有意义的。很高兴了解getMaximumWindowBounds()API调用!更新:集成该更改后,由于我使用的实际布局,我遇到了一个新问题。是否要查看新版本?谢谢。这是一个不同的问题,应该在单独的线程中发布,以获得最佳答案。你是对的。回滚我的编辑并在此处发布一个新问题: