【问题标题】:how can i use setPreferredSize in java?我如何在 java 中使用 setPreferredSize?
【发布时间】:2017-08-05 08:23:37
【问题描述】:

我有一个问题:我想创建一个小游戏,我必须制作一个如下所示的窗口:

当我试图改变“Fun With Words”的字体大小时,它没有改变......

我该怎么办?

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



public class GameWords extends JFrame 

{
    private static int W = 800 ;
    private static int H = 600 ;



    public GameWords ()
    {
         setTitle ( " Word Order Game " ) ;
         setSize ( H , W ) ;
         setLayout ( new FlowLayout() ) ;
         setDefaultCloseOperation ( EXIT_ON_CLOSE ) ;
         createContent () ;
         setVisible ( true ) ;
    }

    public void createContent ()
    {
        JLabel heading = new JLabel (" Fun With Words ") ;
        heading.setFont ( heading.getFont().deriveFont ( 26f ) );
        heading.setPreferredSize ( new Dimension ( H , 4 * W ) ) ;
        JLabel h1 = new JLabel ( " Hey Kids! Want to prictice your typing and word-ordering Skills ? \n" ) ;
        add ( heading ) ;
        add ( h1 ) ;


    }


    public static void main(String[] args) 

    {
        new GameWords () ;

    }

}

【问题讨论】:

    标签: java swing main


    【解决方案1】:

    简短的回答是不要,API 能够自行计算所需的大小。

    更长的答案是,不要使用setSize,而是使用pack,它使用容器首选大小来计算窗口的大小

    public GameWords ()
    {
         setTitle ( " Word Order Game " ) ;
         setLayout ( new FlowLayout() ) ;
         setDefaultCloseOperation ( EXIT_ON_CLOSE ) ;
         createContent () ;
         pack();
         setVisible ( true ) ;
    }
    
    public void createContent ()
    {
        JLabel heading = new JLabel (" Fun With Words ") ;
        heading.setFont ( heading.getFont().deriveFont ( 26f ) );
        JLabel h1 = new JLabel ( " Hey Kids! Want to prictice your typing and word-ordering Skills ? \n" ) ;
        add ( heading ) ;
        add ( h1 ) ;
    
    
    }
    

    作为一般建议,您不应该直接从JFrame 扩展,您不会向该类添加任何新功能,而是将自己锁定在一个用例中。作为一般建议,您应该首先从 JPanel 扩展,然后将其添加到您要使用的任何容器中

    【讨论】:

    • 太好了,它现在可以工作了.. 但是你能告诉我为什么我们使用 pack 时它可以工作吗?因为我的医生很好地问我,谢谢我的帮助^_^
    • 当您在 JFrame 上调用 pack() 时,JFrame 会(递归地)询问其子代的首选尺寸,并且由于您指定的是 FlowLayout,因此 JFrame 从左到右布置其子代在他们喜欢的大小。但是你应该听从@MadProgrammer 的建议,而不是从 JFrame 继承,除非你重写它的一种方法。在您的情况下,您甚至不需要继承 JPanel,因为您也没有向它添加任何功能。只需创建一个包含 JLabel 的 JPanel,然后创建一个 JFrame 并将面板添加到其中。
    • @Mj___3 正如 fred 所说,pack 将根据内容首选大小“打包”内容周围的框架。此信息由使用的各种布局管理器计算
    猜你喜欢
    • 2019-04-09
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多