java - 图形未出现在窗口中

标签 java swing graphics jframe jpanel

我试图在 JFrame 上绘制一个普通的蓝色矩形,当我按下播放按钮时根本没有出现任何窗口(没有蓝色矩形)

我知道网上有教程展示如何在 JFrame 上绘制矩形,但我想知道以下代码的问题以及为什么它不起作用。

public class Window extends JFrame {
    public Window() {
        initialize();       
    }
    private void initialize() {
        JFrame frame = new JFrame();
            frame.setBounds(100, 100, 600, 600);
        frame.setResizable(false);
                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(null);
            frame.getContentPane().add(new Display());

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

        Window window = new Window();   
    }   
}
public class Display extends JPanel {
@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
    public void reDraw() {
        repaint();
    }
}

总的来说,我想知道上面代码的问题以及如何修复它,以便在播放程序时在窗口上绘制蓝色矩形。 感谢您的阅读:)

最佳答案

您的主要问题是:

  • frame.getContentPane().setLayout(null); - 这通常是一个坏主意。这种方法存在很多问题,很难一一列举。
    • null 布局要求您对容器的子容器的位置和大小承担全部责任。他们没有考虑不同的平台渲染系统和特征
    • 您会发现很难准确调整父窗口的大小,因为可用内容大小是框架大小减去框架边框,因此当您将框架设置为 600x600 时,实际可用内容空间将为较小
    • 组件的默认大小和位置是 0x0 - 因此,除非您愿意控制它(这就是布局管理器所做的),否则它永远不会显示(Swing 并不愚蠢,但它很懒;))
  • 未在 JFrame 上调用 setVisible
  • 未为显示面板提供尺寸调整提示
  • 扩展JFrame ...并且不使用它。通常不鼓励扩展 JFrame,但在您的情况下,它只是添加不需要的噪音

工作示例

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {//extends JFrame {

    public Test() {
        initialize();
    }

    private void initialize() {
        JFrame frame = new JFrame();
        //frame.setBounds(100, 100, 600, 600);
        //frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.getContentPane().setLayout(null);
        frame.getContentPane().add(new Display());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Test window = new Test();
    }

    public class Display extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 600);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.fillRect(0, 0, 100, 100);
        }

        // Not sure what benefit this provides
        //public void reDraw() {
        //    repaint();
        //}
    }
}

您可能想看看Laying Out Components Within a Container更好地了解布局管理器及其功能和工作原理(以及为什么应该使用它们;))

关于java - 图形未出现在窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682153/

相关文章:

java - Java中单变量非线性函数的最小查找

java - 如何才能拥有一组总值(value)最大的 JSpinner 对象?

opengl - 将整数纹理附加到帧缓冲区

Android 图形内部结构

java - 执行线程核心数

java - 什么是 Java BE?

java - 登录后重定向到自定义网址

java - 不支持的表单文件版本 : 1. 9. 表单无法打开

java - 如何在 .NET 应用程序中托管 Java Swing 组件

opengl - 为什么剪刀测试要落后于片段操作?