如何设置JFrame的大小,不包括边框?

3
我有一个JFrame,我使用setBounds设置了它的大小。然而,这会使窗口包括边框都变成那个大小(事后想想是很合理的)。但我想要的是窗口的大小为,比如说,800x600加上边框。这很重要,因为我从JFrame的BufferStategy中绘制到Graphics对象,但在y值小于约20时却在标题栏下面绘制。我想象不同的操作系统(甚至是不同的操作系统设置)可能有不同厚度的边框。我原以为边框只是后来附加到窗口上的,但事实并非如此。
所以,如何让边框内部的空间成为特定的大小,无论边框的厚度如何?另外,为了让我的生活更轻松,我如何使点0, 0成为帧可见内容的左上角?
顺便说一句,使用setUndecorated也会出现自己的问题,所以我目前不打算尝试。
6个回答

19
  1. 为内容面板设置首选大小。
  2. 调整窗口大小。
  3. 任务完成。

E.G.

Fixed Size Content

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

class FixedSizeContent {
    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JFrame f = new JFrame("Fixed size content");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                Container c = f.getContentPane();
                c.setBackground(Color.YELLOW);
                // adjust to need.
                Dimension d = new Dimension(400,40);
                c.setPreferredSize(d);
                f.setResizable(false);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

抱歉,这并没有解决我的问题。假设我从(0, 0)到(100, 100)画一条线。该行从窗口左上角开始。不是您图片中的黄色区域,而是窗口本身。该行不会出现在标题栏所在的位置。这意味着我在y = 0和y = ~25之间绘制的任何内容都会被该栏隐藏。您的解决方案并没有改变这一点。但是,当我进入全屏独占模式时,什么也不会被绘制,这与setUndecorated存在相同的问题。 - AlbeyAmakiir
3
如果我上传一个您最好的尝试的SSCCE,您觉得怎么样? - Andrew Thompson
1
@kleopatra JaHuhh?每次我看到这个评论,我都觉得这一定是一个笑话,但我就是不明白(这让我很难过:( )。你是什么意思? - Andrew Thompson
1
抱歉,不想让你难过 - 这是德语,狗在受苦时发出的声音<g>。 - kleopatra
2
我曾经有一只狗。它从来没有发出过那样的声音。但是,它也从未遭受过痛苦。 ;) - Andrew Thompson

7

让绘图组件将图形的大小报告为其首选大小

 @Override
 public Dimension getPreferredSize() {
      return new Dimension(myDrawing.getWidth(), myDrawing.getHeight());  
 } 

然后跟随 @Andrew 的第二点和第三点。

你的非官方Swing规则+1 - mKorbel
图形对象在窗口大小设置之前没有大小。所以,我又回到了起点。除非我漏了什么? - AlbeyAmakiir

6

这很重要,因为我正在从JFrame的BufferStrategy绘制到Graphics对象中。

为什么你要使用BufferStrategy。那是旧的AWT代码。Swing默认是双缓冲的。

在Swing中进行自定义绘画时,您应该扩展JPanel(或JComponent),然后覆盖paintComponent()方法。您将此组件添加到框架的内容窗格中。然后,如果您遵循kleopatra的建议,就不会有问题。

有关更多信息和示例,请参见Swing教程上的Custom Painting部分。


哦,原来我是在试图解决错误的问题。只是症状,而不是根本原因。我会检查一下,如果一切顺利,就会将您标记为已接受。 - AlbeyAmakiir

2
您可以使用这个方法来避免使用容器(Container)
JFrame f=new JFrame("Your title");

Dimension d=new Dimension();

d.setSize(x,y);

f.setSize(d); 

0

我已经找到了我的项目的解决方案。这是一个很旧的帖子,也许有人需要这段代码。试试这个。

public gfx_CFrame(String _Title, int _Height, int _Width)
{
    super(_Title);

    Dimension Dim = new Dimension(_Width, _Height);

    setMaximumSize(Dim);
    setMinimumSize(Dim);
    setPreferredSize(Dim);
    pack();

    Dim.width  = _Width  + (getWidth()  - getContentPane().getWidth()); 
    Dim.height = _Height + (getHeight() - getContentPane().getHeight());

    setMaximumSize(Dim);
    setMinimumSize(Dim);
    setPreferredSize(Dim);
    pack();
    // ....
}

0

创建 Canvas canvas = new Canvas();

并将canvas添加到JFrame中,

创建canvas.createBufferStrategy(2);

获取BufferStrategy bs = canvas.getBufferStrategy();

创建Graphics2D graphics2D = (Graphics2D) bufferStrategy.getDrawGraphics();

使用graphics2DBufferedImage中进行绘制。

显示在屏幕上bufferStrategy.show();

添加各种控件到canvas中...

尝试使用graphics2D.translate(x,y)canvas移动到针对窗口边缘的某个位置Insets insets...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接