Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 我们可以在不扩展JPanel类的情况下使用Paint组件吗?_Java_Swing_Jpanel - Fatal编程技术网

Java 我们可以在不扩展JPanel类的情况下使用Paint组件吗?

Java 我们可以在不扩展JPanel类的情况下使用Paint组件吗?,java,swing,jpanel,Java,Swing,Jpanel,我正在制作一个gui,其中使用paint组件方法画一条线,我知道我可以用extends JPanel来做这件事。但我真的想知道如何在不扩展任何内容的情况下做到这一点,就像在这个程序中一样 public class Main { static JPanel panel; public static void main(String[] args) { JFrame frame = new JFrame("Our Frame"); panel =

我正在制作一个gui,其中使用paint组件方法画一条线,我知道我可以用extends JPanel来做这件事。但我真的想知道如何在不扩展任何内容的情况下做到这一点,就像在这个程序中一样

public class Main {

    static JPanel panel;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Our Frame");
        panel = new JPanel();
        frame.setSize(600,480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.add(panel);
    }
}
在这条路上

public class Main {

    public static void main(String[] args) {
        Frame obj = new Frame();
    }
        }
框架 从技术上讲,您可以使用
component.getGraphics()
获取给定组件的图形上下文,然后在此基础上绘制由于组件也将重新绘制自身,因此重新绘制后,图形将立即消失。所以,不要想这样做,你只会浪费你的时间

但是,如果您有一个组件在
paintComponent()
中呈现
buffereImage
,则可以在该图像上绘制(使用
img.getGraphics();
等),然后该组件将反映这些图形。这将允许您使用一个简单的
MyPanel
类,其中
paintComponent()
将只绘制图像。然后,您可以获得对图像的引用,并根据需要在该图像上绘制

您已经在扩展代码中的某些内容,在您的情况下,这是完全不必要的。您可以删除
Frame
类,并使用以下代码显示
JFrame

JFrame f = new JFrame();
f.setSize(600, 480);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(panel);
f.setVisible(true);

您可以这样做:

JPanel panel = new JPanel(true) {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                // do painting
            }
}

虽然从技术上讲,您可以,但您永远不应该,因为当系统重新绘制组件时,您在组件上绘制的每一个图形都将被替换…
getGraphics
,简单地说,这永远不是一个可行的解决方案。。这不是我说的吗?在这种情况下,我决不会向不小心的开发人员提及它,他们阅读了第一段,而忽略了其余的;)我们需要一些警告标签或红色来标记可怕的东西。@mad在那里,我试图让它看起来更具威胁性。第一个问题是“为什么”?第二个问题是“如何?”。更准确地说:实际的绘画应该在哪里进行?有几个库试图实现这样的目标。它们提供了一些类,您可以在其中调用类似于
myDrawingSurface.drawCircle(x,y,r)的东西和图形“神奇地”出现在屏幕上。但这些只是抽象层(通常是新手程序员),它们只是隐藏了一些“复杂性”(例如,它们在内部仍然使用扩展
JPanel
的类,并在
paintComponent
方法中进行实际绘制)
JPanel panel = new JPanel(true) {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                // do painting
            }
}