3

Swing / G2Dはあまり使用していませんので、しばらくお待ちください。GUIのコンポーネントである次のクラスがあります(描画するCanvasの一種であることが意図されています)。

import javax.swing.*;
import java.awt.*;

public class DrawPanel extends JComponent{
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g;

    g2.setPaint(Color.black);
    g2.fillRect(0, 0, getWidth(), getHeight());

    BrushStroke bs = new BrushStroke();     
    add(bs);
}
}

上記のJComponentに以下を追加しようとしています。

import javax.swing.*;
import java.awt.*;

public class BrushStroke extends JComponent{
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);

    g2.setPaint(Color.red);
    g2.fillOval(0, 0, 10, 10);          
}
}

BrushStrokeはDrawPanelに表示されません。

私はずっと答えを探し続けてきましたが、私が見ているそれぞれの例は矛盾しているようです。

誰かが私を試みたなら、助けていただければ幸いです。また、私が完全に間違ったアプローチを取っている場合は、言ってください。

4

2 に答える 2

3
  1. どのペイント方法でも、パネルにコンポーネントを追加しないでください。Swingがコンポーネントをペイントする必要があると判断するたびに、ペイントメソッドが呼び出されます。したがって、コンポーネントをパネルに複数回追加することになります。

  2. カスタムペイントを行うときは、getPreferredSize()メソッドをオーバーライドして、コンポーネントのサイズを指定する必要があります。このようにして、レイアウトマネージャーはコンポーネントを適切に配置できます。これを行わない場合、推奨サイズは0であるため、ペイントするものはありません。

詳細と例については、カスタムペインティングに関するSwingチュートリアルのセクションをお読みください。

于 2011-11-28T22:23:26.007 に答える
2

このJComponent.add方法について、ドキュメントには次のように書かれています。

注:表示されたコンテナーにコンポーネントが追加されている場合、新しいコンポーネントを表示するには、そのコンテナーでvalidateを呼び出す必要があります。複数のコンポーネントを追加する場合は、すべてのコンポーネントを追加した後で、validateを1回だけ呼び出すことで、効率を向上させることができます。

要素を追加した後、DrawPanelを更新する必要があります。メソッドでそれを行わないように注意しpainComponentてください。無限の再帰になります。

代わりに次の手順を実行してください。

DrawPanel drawPanel = new DrawPanel();
drawPanel.add(new BrushStroke());
drawPanel.repaint();

編集 これは完全に機能するソリューションです(JComponentの代わりにJPanelsを拡張します)

public static void main(String[] args){
   JFrame frame = new JFrame();
   DrawPanel drawPanel = new DrawPanel();
   drawPanel.add(new BrushStroke());
   frame.getContentPane().add(drawPanel);
   frame.pack();
   frame.setVisible(true);
}
class DrawPanel extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.black);
        g2.fillRect(0, 0, getWidth(), getHeight());
    }
    @Override
    public  Dimension getPreferredSize(){
        return new Dimension(100, 100);
    }
}
class BrushStroke extends JPanel{
    public void paintComponent(Graphics g){
        this.setOpaque(false);
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setPaint(Color.red);
        g2.fillOval(0, 0, 10, 10); 
    }
    @Override
    public  Dimension getPreferredSize(){
        return new Dimension(10, 10);
    }
}

出力は次のようになります。

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

于 2011-11-28T20:08:11.677 に答える