Java 我们可以在不扩展JPanel类的情况下使用Paint组件吗?
我正在制作一个gui,其中使用paint组件方法画一条线,我知道我可以用extends JPanel来做这件事。但我真的想知道如何在不扩展任何内容的情况下做到这一点,就像在这个程序中一样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 =
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
}
}