2

重複の可能性:
paintComponent () は JFrame で実行されません

次のコードを使用して 2 つの文字列を表示しています。コンポーネントとして追加したり、jpanel に追加したりするのではなく、jfame で直接描画しています。しかし、文字列を取得する代わりに空白のウィンドウが表示されるのはなぜですか?

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class SimpleAttributes extends JFrame{

SimpleAttributes()
{

    super("Simple Attributes");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 200);
    //setUndecorated(true);
    Container cp=this.getContentPane();
    cp.setBackground(new Color(0,200,0,0));

    setVisible(true);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2=(Graphics2D)g.create();
    g2.setColor(Color.RED);
    g2.drawString("One", 10, 10);

    g.drawString("Two", 10,40);

}
public static void main(String[] args) {
    // TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable(){public void run(){new SimpleAttributes();}});
}

}
4

2 に答える 2

4

JFrame はコンポーネントではないため、機能はありませんpaintComponent()API ドキュメント を参照してください

于 2012-08-08T16:56:51.053 に答える
2

上で述べたように、そのような方法はありません (私はタイピングが速くなりました) JPanels について考えます。

あなたができることは、独自のメソッドを作成してメソッドContainerをオーバーライドし、それをbyとして使用することです:paint()ContentPaneframe.setContentPane(Container con)

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SimpleAttributes extends JFrame {

    SimpleAttributes() {

        super("Simple Attributes");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 200);
        //setUndecorated(true);
        setContentPane(new MyContainer());
        getContentPane().setBackground(new Color(0, 200, 0, 0));

        setVisible(true);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new SimpleAttributes();
            }
        });
    }
}

class MyContainer extends Container {

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setColor(Color.RED);
        g2.drawString("One", 10, 10);
        g.drawString("Two", 10, 40);
    }
}

1 つの回答のコメントに記載されているように、ダイアログのヘッダーのオフセットを補正paint()するだけで使用できます。JFrame

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class SimpleAttributes extends JFrame {

    SimpleAttributes() {

        super("Simple Attributes");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 200);
        //setUndecorated(true);
        getContentPane().setBackground(new Color(0, 200, 0, 0));

        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setColor(Color.RED);
    g2.drawString("One", 10, 10);//wont show
        g2.drawString("One", 50, 50);//will show
        g.drawString("Two", 40, 40);//will show
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new SimpleAttributes();
            }
        });
    }
}

しかし、それはすべてあなたに頭痛の種を与えるだけで、なぜそれを好ましい方法でやらないのですか? AJPanelとオーバーライドpaintComponent(Graphics g);

于 2012-08-08T16:53:36.610 に答える