4

そのため、クラスではJavaプログラムを作成しています。JFrameでpaint(Graphics g)関数を使用しようとしています。私たちは過去(数週間前)にそれを試しましたが、以前は機能していました。しかし、今はそうではありません(またはどこかで間違いを犯しました)。paintComponent(Graphics g)も使用しようとしましたが、何も機能しないようです。これが私たちのコードです:

public class MainAc {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Class Paint");       
        JButton button = new JButton("Click for more");             
        frame.setSize(800, 600);    
        frame.add(button);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(200,100);
        frame.setVisible(true);     
    }
    public void paint(Graphics g){
        g.drawString("Hello", 200, 50);
    }
}
4

4 に答える 4

12

Componentあなたのクラスは、絵を描くことができるものから拡張されていません

その他のアイデアについては、カスタムペイントの実行をお読みください

あなたは次のようなことをすることができます:

ここに画像の説明を入力してください

public class SimplePaint {

    public static void main(String[] args) {
        new SimplePaint();
    }

    public SimplePaint() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PaintPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class PaintPane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();
            String text = "Look ma, no hands";
            FontMetrics fm = g2d.getFontMetrics();
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g2d.drawString(text, x, y);
            g2d.dispose();


        }

    }

}

可能であれば、トップレベルのコンテナのpaintメソッドをオーバーライドしないようにする必要があります。他の理由がない場合は、ダブルバッファリングされていません。

また、同じ理由でSwingベースのコンポーネントを拡張してみてください。重いコンポーネントと軽量のコンポーネントを混在させると、ペイントで問題が発生する可能性があります。

于 2012-10-30T10:28:14.323 に答える
5

つまり、あなたがしているのは、ではなく、paint自分のMainAcクラス内にメソッドを実装することですJFrame

クラスMainAc自体は、から派生する必要がありJFrameます。

以下のコードが機能するはずです。継承を理解していない場合は、クラスノートを確認する必要があります。継承はそこにあります。

public class MainAc extends JFrame {

    public static void main(String[] args) {
        new MainAc();
    }
    
    public MainAc() {
        super("Class Paint");       
        JButton button = new JButton("Click for more");             
        setSize(800, 600);    
        add(button);
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(200,100);
        setVisible(true);
    }
    
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Hello", 200, 50);
    }
    
}
于 2012-10-30T10:26:15.290 に答える
4

コードがそうであるように、あなたはpaintクラスでメソッドを定義しているだけです。クラスは拡張されるので、にペイントするObject必要はありません。overriddingJComponent

またはを実際にオーバーライドするには、クラスがComponentまたはそれ自体のサブクラスを拡張する必要があります。あなたの場合、拡張します。ComponentpaintpaintComponentMainAcJFrame

于 2012-10-30T10:26:18.423 に答える
-1

これは、動作しているように見えるStickyのコードの簡略化されたバージョンです。これを拡張JAppletに変更し、のinit()代わりにメソッドを使用しmain()ます。

public class JavaApplication51 extends JApplet {
    public  void something() {
       JButton button = new JButton("Click for more");             
        add(button);
        setLayout(null);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(101,20);
        setVisible(true); 
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Hello", 200, 50);
    }

    public void init() {
        something();
    }
}
于 2015-02-21T07:24:48.033 に答える