Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame上没有显示任何内容_Java_Graphics_Jframe - Fatal编程技术网

Java JFrame上没有显示任何内容

Java JFrame上没有显示任何内容,java,graphics,jframe,Java,Graphics,Jframe,这就是我正在做的,但在Jframe窗口上什么都没有显示。我并没有扩展类JFrame来完成我的工作,在窗口上显示对象是否需要这样做 public class testGraphics { static JFrame workingFrame = null; public static void main(String args[]) { JFrame workingManager = new JFrame("Hello"); working

这就是我正在做的,但在Jframe窗口上什么都没有显示。我并没有扩展类JFrame来完成我的工作,在窗口上显示对象是否需要这样做

public class testGraphics {
    static JFrame workingFrame = null;

    public static void main(String args[])
    {
        JFrame workingManager = new JFrame("Hello");
        workingManager.setSize(500, 500);
        workingManager.setVisible(true);
        Graphics g = workingManager.getGraphics();
        JPanel jp = (JPanel) workingManager.getContentPane();
        workingManager.paintComponents(g);
        g.fillOval(0, 0, 30, 30);
        g.drawOval(0, 50, 30, 30);
        g.setColor(Color.CYAN);
    }
}
setSize()
setVisible()
必须位于方法的底部:

 JFrame workingManager = new JFrame("Hello");
    Graphics g = workingManager.getGraphics();
    JPanel jp = (JPanel) workingManager.getContentPane();
    workingManager.paintComponents(g);
    g.fillOval(0, 0, 30, 30);
    g.drawOval(0, 50, 30, 30);
    g.setColor(Color.CYAN);

    workingManager.setSize(500, 500);
    workingManager.setVisible(true);
不要调用
getGraphics()
或显式调用
paintXxx()
进行自定义绘制。进行自定义绘制的正确方法是覆盖要绘制的面板的
paintComponent
方法。将为您隐式调用重写的方法。然后将该面板添加到框架中。您还应该覆盖面板的
getPreferredSize()
,使其具有首选大小,这样您就可以打包框架了

class PaintPanel extends JPanel {
    @Override
    protected paintComponent(Grapchics g) {
        super.paintComponent(g);
        g.drawString(....);
    }
    @Override
    public Dimension getPreferredSize() {'
        return new Dimension(300, 300);
    }
}
然后将其添加到框架中(或者,如果要将其设置为框架的内容窗格,请执行此操作)


更多信息请参见

我对您的代码做了一些更改,以使其正常工作

  • 我将您的main方法更改为调用SwingUtilities invokeLater方法,以确保Swing组件已在上定义和使用

  • 我画了一幅JPanel的画。我先设定颜色,然后画椭圆

  • 我添加了一个JFrame默认关闭操作。必须指定默认的关闭操作,否则Java应用程序将在关闭JFrame后继续运行

  • 我将尺寸移动到绘图面板。调用JFrame pack方法时将计算帧大小

  • 下面是修改后的代码:

    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TestGraphics implements Runnable{
    
        private JFrame workingManager;
    
        private JPanel drawingPanel;
    
        @Override
        public void run() {
            workingManager = new JFrame("Hello");
            workingManager.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            drawingPanel = new DrawingPanel();
    
            workingManager.add(drawingPanel, BorderLayout.CENTER);
            workingManager.pack();
            workingManager.setLocationByPlatform(true);
            workingManager.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestGraphics());
        }
    
        public class DrawingPanel extends JPanel {
    
            private static final long   serialVersionUID    = 
                    -3701718376300985046L;
    
            public DrawingPanel() {
                this.setPreferredSize(new Dimension(500, 500));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                g.setColor(Color.CYAN);
                g.fillOval(0, 0, 30, 30);
                g.drawOval(0, 50, 30, 30);
            }
    
        }
    
    }
    

    尝试将框架设置为在末尾可见。此外,尝试在Swing事件调度线程上执行所有操作。设置为在末尾可见会使nullPointerException@user3709980这意味着您没有初始化workingManager实例。实际上,我是这方面的新手,我猜workingManager已经初始化,正如您在这里使用
    getGraphics()所看到的
    在渲染帧之前的帧上(setVisible),将返回一个空的
    图形
    对象。与帧的初始化无关。在任何情况下,
    getGraphics()
    都不是执行自定义绘制的正确方法。首先,您不知道何时需要重新绘制组件,并且内容将在没有知识的情况下过度绘制。另外请注意,非空图形对象仅在渲染组件后可用。即便如此,任何重新绘制都不会持续。所以不要用这种方式画画。你的意思是,重绘是持久的,所以我看不到任何东西。我的意思是图形对象不会持久到任何重绘。
    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TestGraphics implements Runnable{
    
        private JFrame workingManager;
    
        private JPanel drawingPanel;
    
        @Override
        public void run() {
            workingManager = new JFrame("Hello");
            workingManager.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            drawingPanel = new DrawingPanel();
    
            workingManager.add(drawingPanel, BorderLayout.CENTER);
            workingManager.pack();
            workingManager.setLocationByPlatform(true);
            workingManager.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestGraphics());
        }
    
        public class DrawingPanel extends JPanel {
    
            private static final long   serialVersionUID    = 
                    -3701718376300985046L;
    
            public DrawingPanel() {
                this.setPreferredSize(new Dimension(500, 500));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                g.setColor(Color.CYAN);
                g.fillOval(0, 0, 30, 30);
                g.drawOval(0, 50, 30, 30);
            }
    
        }
    
    }