【问题标题】:JFrame does not show anythingJFrame 不显示任何内容
【发布时间】:2018-12-13 22:02:53
【问题描述】:

我正在尝试在 GUI 中制作 RPG 游戏,但进展并不顺利。 在我添加 JButton 之前,一切都正常工作并按应有的方式显示在窗口中。我不确定添加 JButton 后发生了什么。 应该在灰色区域显示标题,在蓝色区域显示按钮。我试过正常运行并使用调试器运行,没有显示任何文本或按钮。 我正在一步一步地按照教程here 进行操作,我没有看到任何不合适的地方。 (我知道我已经更改了变量名)。

我在这里做错了什么?我需要添加什么额外的东西吗?

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

public class Game {

    JFrame window;
    Container c;
    JPanel titlePanel;
    JPanel startButtonPanel;
    JLabel titleLabel;
    JButton startButton;
    Font titleFont = new Font("Cooper Black", Font.PLAIN, 90);
    Font buttonFont = new Font("Cooper Black", Font.PLAIN, 32);

    public static void main(String[] args) {
        new Game();
    }

    public Game() {

        //Main Window
        window = new JFrame();
        window.setSize(800, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.BLACK);
        window.setLayout(null);
        window.setVisible(true);
        c = window.getContentPane();

        //Title Panel
        titlePanel = new JPanel();
        titlePanel.setBounds(100, 100, 600, 150);
        titlePanel.setBackground(Color.GRAY);

        titleLabel = new JLabel("TEXT RPG");
        titleLabel.setForeground(Color.WHITE);
        titleLabel.setFont(titleFont);

        //Start Button Panel
        startButtonPanel = new JPanel();
        startButtonPanel.setBounds(300, 400, 200, 100 );
        startButtonPanel.setBackground(Color.BLUE);

        //Start Button
        startButton = new JButton("START");
        startButton.setBackground(Color.BLACK);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(buttonFont);


        //Add Elements to Window
        titlePanel.add(titleLabel);
        startButtonPanel.add(startButton);

        //Add Elements to Container
        c.add(titlePanel);
        c.add(startButtonPanel);

    }
}

【问题讨论】:

  • 1) window.setLayout(null); Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) window.setVisible(true); 只有在添加了所有组件并调用了pack() 之后才应该这样做。

标签: swing user-interface jframe jbutton jlabel


【解决方案1】:

不要按照教程教您使用空布局管理器和“手动”设置边界。这不是一个好习惯。
从代码中删除所有边界设置。 而是使用Layout Managers,这就是他们所做的,为您动态设置界限:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Game {

    JFrame window;
    Container c;
    JPanel titlePanel;
    JPanel startButtonPanel;
    JLabel titleLabel;
    JButton startButton;
    Font titleFont = new Font("Cooper Black", Font.PLAIN, 90);
    Font buttonFont = new Font("Cooper Black", Font.PLAIN, 32);

    public static void main(String[] args) {
        new Game();
    }

    public Game() {

        //Main Window
        window = new JFrame();
        window.setSize(800, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c = window.getContentPane();
        c.setBackground(Color.BLACK);
        //window.setLayout(null);

        //Title Panel
        titlePanel = new JPanel();   //JPanel uses FlowLayout by default
        //titlePanel.setBounds(100, 100, 600, 150)
        titlePanel.setBackground(Color.GRAY);


        titleLabel = new JLabel("TEXT RPG");
        titleLabel.setForeground(Color.WHITE);
        titleLabel.setFont(titleFont);

        //Start Button Panel
        startButtonPanel = new JPanel();
        //startButtonPanel.setBounds(300, 400, 200, 100 );
        startButtonPanel.setBackground(Color.BLUE);

        //Start Button
        startButton = new JButton("START");
        startButton.setBackground(Color.BLACK);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(buttonFont);

        //Add Elements to Window
        titlePanel.add(titleLabel);
        startButtonPanel.add(startButton);

        //Add Elements to Container
        c.add(titlePanel, BorderLayout.CENTER);          //JFrame content pane uses BorderLayout by default
        c.add(startButtonPanel, BorderLayout.PAGE_END);

        window.pack();
        window.setVisible(true); //invoke after all added and pack() ed
    }
}

不要指望在第一次尝试时就能得到完全想要的外观。了解如何使用不同的布局管理器以及它们的组合来获得您想要的。

【讨论】:

    【解决方案2】:

    我的一个朋友提出来解决这个问题。他添加了一个叫做“扩展画布”的东西。

    这是固定版本:

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Font;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    public class Game extends Canvas{
        private static final long serialVersionUID = 1L;
        public static JFrame window;
        public static Container c;
        JPanel titlePanel,startButtonPanel;
        JLabel titleLabel;
        JButton startButton;
        Font titleFont = new Font("Cooper Black", Font.PLAIN,90);
        private static int width = 800;
        private static int height = 600;
        public static String title ="Blueberry's Game";
    
        /*----------------------------------------------------------------------------------------------------*/
        public static void main(String[] args){
            Game game = new Game();
            Game.window.setResizable(false);
            Game.window.setTitle(Game.title);
            Game.window.add(game);
            Game.window.pack();
            Game.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Game.window.setLocationRelativeTo(null);
            Game.window.setVisible(true);
        }
        /*----------------------------------------------------------------------------------------------------*/
        public Game(){
    
            window = new JFrame();
            setPreferredSize(new Dimension(width, height));
            window.getContentPane().setBackground(Color.BLACK);
            c = window.getContentPane();
    
            //////////TITLE PANEL//////////////////////
            titlePanel = new JPanel();
            titlePanel.setBounds(100, 100, 600, 150);
            titlePanel.setBackground(Color.BLACK);
            titleLabel = new JLabel("TEXT RPG");
            titleLabel.setForeground(Color.WHITE);
            titleLabel.setFont(titleFont);
    
            //////////START BUTTON PANEL//////////////////////
            startButtonPanel = new JPanel();
            startButtonPanel.setBounds(300, 400, 200, 100);
            startButtonPanel.setForeground(Color.BLUE);
    
            //////////START BUTTON//////////////////////
            startButton = new JButton("START");
            startButton.setBackground(Color.BLACK);
            startButton.setForeground(Color.WHITE);
    
            //////////ADD ELEMENTS TO WINDOW//////////////////////
            titlePanel.add(titleLabel);
            startButtonPanel.add(startButton);
    
            //////////ADD ELEMENTS TO CONTAINER//////////////////////
            c.add(titlePanel);
            c.add(startButtonPanel);
    
        }
        /*----------------------------------------------------------------------------------------------------*/
    }
    

    编辑:我还设法了解为什么窗口在我的问题中没有显示任何内容。我只需要用光标调整窗口大小。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2013-03-02
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多