1

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

第一个(JFrame)

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);}}

第二个(JPanel)

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);}}

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

4

2 回答 2

3

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

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

请参阅自定义绘画方法,了解两个共同点是做你想做的事。

于 2013-05-31T16:12:02.307 回答
3

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

  • 一定要调用super.paintComponent(g).

  • 覆盖getPreferredSize()以建立组件的首选大小。

  • Swing GUI 对象应该事件分派线程上构建和操作。

图片

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);
        }
    }
}
于 2013-05-31T18:02:53.497 回答