1

JFrameを作成してパネルを追加するクラスが
あり、2番目のクラスは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);}}

そして2つ目(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() メソッドで行う必要があります。

2 つの共通点については、カスタム ペインティング アプローチを参照してください。

于 2013-05-31T16:12:02.307 に答える
3

@camickr のポイントの具体的な例として、MyPanel既に をオーバーライドしているため、コンテキストへpaintComponent()の参照を に渡すことができることに注意してください。さらに、GraphicsaddShape()

画像

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 に答える