2

JPanelのみを含むNetbeansのGUIビルダーで作成されたJFrameがあります。getPanelこの JPanel への参照を取得するためのメソッドを作成しました。

public class ShowDrawings extends JFrame {

    public ShowDrawings() {
        initComponents();
    }

    public JPanel getPanel(){
        return panel;
    }

    private JPanel panel;
}

私の主な機能では、私はやっています:

public class Main {
    public static void main(String[] args){
        ShowDrawings sd = new ShowDrawings();
        sd.setSize(800, 600);
        Graphics g = sd.getPanel().getGraphics();
        g.setColor(Color.BLACK);
        g.drawOval(400, 300, 50, 50);
        sd.getPanel().paint(g);
        sd.repaint();
        sd.setVisible(true);
    }
}

しかし、それは何も描きません。私を助けてください。私はいくつかの関連する質問を見てきましたが、それらはすべてそのメソッドを拡張JPanelしてオーバーライドすることを提案しています. paintしかし、私はそのようにしたくありませんでした。ありがとう。

4

2 に答える 2

6

私はいくつかの関連する質問を見てきましたが、それらはすべてそのメソッドを拡張JPanelしてオーバーライドすることを提案しています。paintでもそんなことはしたくなかった

JPanel paint()メソッドをオーバーライドしないでくださいpaintComponent(..)。これはベスト プラクティスであり、異常を生成しないコードが必要な場合に実行する必要があります。また、現在のアプローチでそれを行うと(ご覧のとおり)、永続的な描画が消去されるため、永続的な描画の作成がはるかに難しくなりますrepaint()

むしろ、オーバーライドされたメソッドの最初の呼び出しとして呼び出すことを忘れないように拡張JPanelしてオーバーライドします。また、正しい寸法を返して呼び出せるように、のオーバーライドを忘れないでください(+1 to @mKorbels コメント):paintComponent(Graphics g)super.paintComponent(g)paintComponent(..)getPreferredSize()JPanelpack()JFrame

コード例を次に示します。

ここに画像の説明を入力

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        initComponents();
    }

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

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel testPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);

                Graphics2D g2d = (Graphics2D) grphcs;

                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

                g2d.setColor(Color.GREEN);
                //g2d.drawOval(10,10,100,100);//I like fill :P
                g2d.fillOval(10,10,100,100);

            }

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

        frame.add(testPanel);

        frame.pack();
        frame.setVisible(true);
    }
}
于 2012-12-27T15:28:54.660 に答える
3

初めてフレームを作成repaint()するとき、ShowDrawings sdこのようにペイントしたもの( )は、元の方法sd.getPanel().getGraphics().drawOval(...)で消去されます。JPanel#paintComponent()

アンドリュー・トンプソンが書いたように:

Component.getGraphics()は使用しないでください。代わりに、paint()(AWT)またはpaintComponent()(Swing)メソッドをサブクラス化してオーバーライドします。

Component.getGraphics()は単に機能しません。Javaは、グラフィックの描画にコールバックメカニズムを使用します。getGraphics()を使用してグラフィック情報をコンポーネントに「プッシュ」することは想定されていません。代わりに、Javaがpaint()/ paintComponent()メソッドを呼び出すまで待つことになっています。その時点で、コンポーネントに実行したい図面を提供することになっています。

何かをチェック/デバッグしているだけの場合は、次のようなこともできます。

class Test {
    private JPanel panel = new JPanel() {
        public void paintComponent(Graphics g) {
             g.setColor(Color.BLACK);
             g.drawOval(400, 300, 50, 50);
        }
    };
}
于 2012-12-27T15:12:00.067 に答える