Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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图形在没有扩展的情况下不执行绘制功能_Java_Swing_Graphics_Paint - Fatal编程技术网

Java图形在没有扩展的情况下不执行绘制功能

Java图形在没有扩展的情况下不执行绘制功能,java,swing,graphics,paint,Java,Swing,Graphics,Paint,我一直在与Java的图形作斗争,我一直在阅读有关绘制Java图形的文档和教程 我发现的每个示例似乎都有一个主类,它扩展了JPanel,然后调用自己,以某种方式执行paint函数 不使用extends就可以绘制图形吗?我有一个基本程序 import javax.swing.*; import awt.Graphics; public class basicWindow { public static void main(String[] args) { JFrame

我一直在与Java的图形作斗争,我一直在阅读有关绘制Java图形的文档和教程

我发现的每个示例似乎都有一个主类,它扩展了JPanel,然后调用自己,以某种方式执行paint函数

不使用extends就可以绘制图形吗?我有一个基本程序

import javax.swing.*;
import awt.Graphics;

public class basicWindow {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setTitle("Basic Window");
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel();

        frame.add(panel);

        frame.setVisible(true);

    }

    public void paint(Graphics g) {

        g.fillRect(5, 15, 50, 75);

    }

}
这会打开一个窗口,但不会绘制我所期望的任何内容,因为我不知道如何执行paint函数

如果我尝试

Graphics graphic = new Graphics();

paint(graphic);

它不起作用,因为它抱怨类是抽象的。

您需要阅读教程并遵循它们。JavaSwing使用被动图形,您的代码需要尊重这一点

  • 根据教程,让您的绘图类扩展JPanel
  • 在paintComponent方法覆盖内绘制
  • 不要忘记
    @Override
    注释
关于,

不使用extends就可以绘制图形吗

  • 您可以在BuffereImage上绘制,并在paintComponent方法中显示。这仍然需要扩展组件
  • 您可以使用通过在组件上调用
    getGraphics()
    获得的图形对象进行绘制,但是如果这样做,图像将不稳定,并且您可能会抛出NPE,因此不建议这样做
不使用extends就可以绘制图形吗

是的,这当然是可能的。正如@HovercraftFullOfEels在评论中提到的:

您可以在
缓冲区图像上绘制

如果在
JLabel
(我们称之为
标签
)中显示该图像,则要在图像更改后更新屏幕,只需调用:

label.repaint();

扩展部分是问题的一部分,我希望使用它时不会出现问题extends@Trent当前位置最好的答案是不要。为什么您不希望使用标准的Swing协议呢?在使用extends之前,我遇到了几个问题,我的类被强制保留为该对象unconditionally@Trent:通常,这些类型的问题最好通过良好的MVC关注点分离来解决。这样做,你就可以让图形和视图保持原样了。@AndrewThompson:请给出答案