0

Java Graphicsを使用して、単純な長方形を描画しようとしました。

Appletうまく動作しますが、に表示するために使用すると、長方形が表示されますが、JFrame背景が異常になります

コーディングは次のとおりです。

package graphicsex;

import java.awt.Graphics;

public class Graphics2 extends javax.swing.JFrame {

    public static void main(String[] args) {
        Graphics2 inst = new Graphics2();
        inst.setVisible(true);
    }

    public Graphics2() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            pack();
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g) {
        g.drawRect(10, 20, 30, 40);
    }
}

次にJTextArea、これら2つのクラスを使用して使用しようとしましたが、この場合、長方形はまったく表示されません。

GraphicsEx1.java:

package graphicsex;

import javax.swing.JTextArea;
import java.awt.Graphics;

public class GraphicsEx1 extends javax.swing.JFrame {

    private JTextArea jTextArea1;

    {
        //Set Look & Feel
        try {
            javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        GraphicsEx1 inst = new GraphicsEx1();
        inst.setVisible(true);
    }

    public GraphicsEx1() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            getContentPane().setLayout(null);
            {
                jTextArea1 = new JTextArea();
                getContentPane().add(jTextArea1);
                jTextArea1.setBounds(7, 7, 371, 245);
                jTextArea1.setEnabled(false);
            }
            pack();
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
        postInitGUI();
    }

    public void postInitGUI() {
        DisplayItems dp = new DisplayItems();
        jTextArea1 = dp;
        dp.setVisible(true);
        this.add(jTextArea1);
    }
}

およびDisplayItems.java:

package graphicsex;

import java.awt.Dimension;
import java.awt.Graphics;

public class DisplayItems extends javax.swing.JTextArea {

    public DisplayItems() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setPreferredSize(new Dimension(400, 300));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g) {
        g.drawRect(10, 20, 50, 100);
        g.drawString("Kalai", 90, 150);
    }
}

JFrame,JPanelJTextarea`orなどのスイングコンテナにグラフィックコンポーネントを表示するのを手伝ってくれる人はいますか?

4

2 に答える 2

4

paintトップレベルコンテナのメソッドをオーバーライドすることはお勧めできません...

JFrame他の多くのコンポーネントが配置されているいくつかの重要なレイヤーが含まれています、これを行うことを購入してください...

public void paint(Graphics g){
    g.drawRect(10,20,30,40);
}

子コンポーネントのいずれかがペイントを開始するのを正常に停止しました。実際には、長方形以外のものを停止しました。

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

(トップレベルのスイングコンテナの秘密の生活-ルートペインの使用方法から撮影した写真)

に呼び出しを追加することを提案する人もいるかもしれませんがsuper.paint(g)、私はお勧めしません。

JFrameのガラス板のようなものを使用することをお勧めします...これにより、フレーム内にあるコンポーネントをペイントできるようになります。コンポーネントの下にペイントする必要がある場合は、代わりにJFrameのコンテンツペインを置き換えてください。

あなたが見つけるかもしれません...

役に立つ...

アップデート

テキスト領域でカスタムペイントを実行しようとすると、問題が発生し始めていると思います。

問題は、paintComponent背景とテキストを1回のファウルでペイントすることです。つまり、呼び出す前にsuper.paintComponent行ったペイントはすべてレンダリングされますが、その上で行われたペイントはテキストをペイントします。

テキスト領域を不透明に設定して、背景を自分でペイントすることができます...

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

public class CustomTextArea extends JTextArea {

    public CustomTextArea() {
        setOpaque(false);
    }

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

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        g.fillRect(0, 0, 100, 100);
        super.paintComponent(g);
    }

}

問題は、しかし、人々が不透明なレベルを休ませてあなたの仕事を破壊するのは簡単です。setOpaqueまたはをオーバーライドすることはできますがgetOpaque、ユーザーが実際にコンポーネントを透明に設定して、背景の塗りつぶしを停止できるようにするタイミングをどのように知ることができますか?

于 2013-01-04T06:56:54.467 に答える
0

* jPanel の使用 *

jpanel を使用すると、グラフィック要素を描画できます。

import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class GraphicsEx1 extends javax.swing.JFrame {
private JScrollPane jsp1;
private JTextArea jta1;
private JPanel jpnl1;

{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
} catch(Exception e) {e.printStackTrace();}
}

public static void main(String[] args) {
GraphicsEx1 inst = new GraphicsEx1();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}

public GraphicsEx1() {
super();
initGUI();
postInitGUI();
}

private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
{
jsp1 = new JScrollPane();
getContentPane().add(jsp1);
jsp1.setBounds(10, 32, 372, 223);
{
jpnl1 = new JPanel();    //<----------------
jsp1.setViewportView(jpnl1);    //<----------------
jpnl1.setBackground(new java.awt.Color(255,255,255));
jpnl1.setLayout(null);
//jpnl1.setPreferredSize(new java.awt.Dimension(359, 327));
}
}
pack();
setSize(400, 300);
} catch (Exception e) {e.printStackTrace();}
}

public void postInitGUI(){
frmGrpView gp=new frmGrpView();
jta1=new JTextArea();
jta1=gp;
jta1.setBounds(0,0, 336, 197);
jta1.setVisible(true);
//jpnl1.setBounds(0, 0, 336, 197);
jpnl1.add(jta1);    //<----------------
jpnl1.revalidate();
jsp1.revalidate();
}
}
//----------------------- Second Class --------------------------
class frmGrpView extends JTextArea{
public frmGrpView() {
super();
setEditable(false);
}
public void paint(Graphics g){
super.paint(g);
g.drawRect(10, 10, 100, 100);
}
}
于 2013-01-06T18:57:15.600 に答える