图形未出现在 window 中

Graphics not appearing in window

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

我知道网上有教程介绍如何将矩形绘制到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();
    }
}

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

您的主要问题是:

  • frame.getContentPane().setLayout(null); - 这通常不是一个好主意。这种方法存在很多问题,很难一一列举。
    • null 布局要求您对容器的子项的位置和大小承担全部责任。他们没有考虑不同的平台渲染系统和特征
    • 您会发现很难准确调整父级 window 的大小,因为可用的内容大小是框架大小减去框架边框,因此当您将框架设置为 600x600 时,实际可用的内容 space 会变小
    • 组件的默认大小和位置是 0x0 - 因此除非您愿意控制它(布局管理器无论如何都会这样做),否则它永远不会显示(Swing 并不笨,但是它很懒惰 ;))
  • 未在 JFrame
  • 上调用 setVisible
  • 不为 Display 面板提供尺码提示
  • 正在扩展 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 以更好地了解布局管理器以及它们的作用和工作方式(以及为什么要使用它们 ;))