Java-图形-在JPanel上添加另一个形状

Java-图形-在JPanel上添加另一个形状,java,swing,graphics,drawing,Java,Swing,Graphics,Drawing,我有一个类,它制作了一个JFrame并在上面添加了一个面板 第二个扩展了JPanel并在其上绘制 第一个(JFrame) 第二个(JPanel) 如何使用addShape()方法在JPanel上添加字符串?不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失 自定义绘制应始终在组件的paintComponent()方法中完成 请参阅,这两个共同点就是做您想做的事情。不要使用组件的getGraphics()方法进行自定

我有一个类,它制作了一个JFrame并在上面添加了一个面板
第二个扩展了JPanel并在其上绘制

第一个(JFrame)

第二个(JPanel)


如何使用addShape()方法在JPanel上添加字符串?

不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失

自定义绘制应始终在组件的paintComponent()方法中完成

请参阅,这两个共同点就是做您想做的事情。

不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失

自定义绘制应始终在组件的paintComponent()方法中完成


请参阅,这两个公用项就是做你想做的事。

作为@camickr观点的一个具体示例,请注意
MyPanel
已经覆盖了的
paintComponent()
,因此可以将对
图形
上下文的引用传递到
addShape()
。另外,

  • 确保调用
    super.paintComponent(g)

  • 重写
    getPreferredSize()
    ,以建立组件的首选大小

  • Swing GUI对象应仅在上构造和操作


作为@camickr观点的一个具体示例,请注意
MyPanel
已经覆盖了的
paintComponent()
,因此您可以将对
图形
上下文的引用传递到
addShape()
。另外,

  • 确保调用
    super.paintComponent(g)

  • 重写
    getPreferredSize()
    ,以建立组件的首选大小

  • Swing GUI对象应仅在上构造和操作


为什么
addShape
方法需要从
paintComponent
方法中“获取”g?这是设置用来更改主机对等组件中像素的方法。另一种方法是写入
buffereImage
的像素,然后更新屏幕。这对我没有多大帮助,但至少现在我知道要写什么才能让它工作。。。所以,谢天谢地,这不是很令人满意。在最基本的层面上,您的Java程序必须共享主机的像素,而您的程序并不总是可以访问这些像素。当我希望addShape(Graphics g)方法独立运行,而不是每次在JFrame上添加MyPanel时,我该怎么办。这就是我最想知道的,
addShape
方法为什么需要从
paintComponent
方法中“获取”g?这是设置用来更改主机对等组件中像素的方法。另一种方法是写入
buffereImage
的像素,然后更新屏幕。这对我没有多大帮助,但至少现在我知道要写什么才能让它工作。。。所以,谢天谢地,这不是很令人满意。在最基本的层面上,您的Java程序必须共享主机的像素,而您的程序并不总是可以访问这些像素。当我希望addShape(Graphics g)方法独立运行,而不是每次在JFrame上添加MyPanel时,我该怎么办。这是我最想知道的
class MyWindow {

void qwe() {
    JFrame frame = new JFrame("qwe");
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setSize(300, 200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MyPanel panel = new MyPanel();
    panel.setLayout(null);
    frame.add(panel);}}
class MyPanel extends JPanel {

public void paintComponent(Graphics g) {
    g.drawRect(50,50,90,70);
}

public void addShape() {
    Graphics g = this.getGraphics();

    Graphics2D gg = (Graphics2D) g;

    gg.drawString("qwe",20,20);}}
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyWindow {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyWindow().qwe();
            }
        });
    }

    void qwe() {
        JFrame frame = new JFrame("qwe");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MyPanel panel = new MyPanel();
        panel.setLayout(null);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class MyPanel extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawRect(50, 50, 90, 70);
            addShape(g);
        }

        public void addShape(Graphics g) {
            g.drawString("qwe", 20, 20);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }
    }
}