2017-10-29 6 views
1

私はメインクラスとその中にpaintComponentメソッドを持つサブクラスCircleを持っています。サークルを描画するために、そのメソッドをメインクラスに呼び出そうとしていますが、何も表示されません。理由はわかりません。Javaは別のクラスからpaintComponentを描画しません

マイサークルクラス:

public class Circle extends Shape { 
Integer rad; 

public Circle(int posx,int posy, int rad) { 
    this.posx = posx; 
    this.posy = posy; 
    this.rad = rad; 
} 

class drawCircle extends JPanel { 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.green); 
     g.fillOval(posx,posy,rad,rad); 
    } 
    } 
} 

私の主な方法は

public class drawFrame extends JFrame { 
JPanel panel1; 
JPanel panel2; 
Square square1; 
Circle circle1; 



public drawFrame() { 

    panel2= new JPanel(); 
    panel1= new JPanel(); 

int rad = 0; 
    circle1 = new Circle(posx, posy,rad); 
    Circle.drawCircle drawCi = circle1.new drawCircle(); 
    add(panel1, BorderLayout.CENTER); 
    panel1.add(drawCi); 

だから基本的に私は、コードの主要な部分のいくつかのスニペットを与えてくれたスニペット。私がやったことは、Circle drawCircle内部クラスから新しいオブジェクトを作成してmainPanelに追加して、私の作成した新しいCircleオブジェクトであるmainPanelの内容をJframeが出力するようにしました。しかし、これは動作しないようです。

+0

答えるために編集を参照してください。不明な点や質問に答えた場合はコメントしてください。 –

答えて

4

コードが混乱するので、簡略化することをおすすめします。

問題:

  • あなたは不必要に内部クラス、drawCircleを使用しています。必要でないときにクラスをネストしないで、代わりに描画コンポーネントに独自のスタンドアロンクラスを与えます。
  • 描画コンポーネントを作成していますが、GUIに追加することはありません。トップレベルのウィンドウ(ここではJFrame)に追加しないと、決して表示されません。 を編集:実際には追加していますが、その好ましいサイズは0,
  • です。paintではなくpaintComponentを上書きしています。これには、後でこれを実行しようとするとぎこちないアニメーションとリスク(塗料もコンポーネントの子コンポーネントと枠線の描画に影響します)の両方の問題があります。
  • あなたの描画コンポーネントには優先サイズが設定されていないので、サイズは[0,0]になります。これは図面の表示には役立ちません。

代わりに、JPanelを拡張するスタンドアロンのネストされていないクラスを作成し、サークルを描画するpaintComponentをオーバーライドし、表示されたJFrameに必ず追加してください。また、描画コンポーネントの推奨サイズを設定するか、getPreferredSize()メソッドをオーバーライドします。もちろん、コンポーネントを追加してから、setVisible(true)を呼び出した後、JFrameをpack()にしてください。

小さな問題:Java naming conventionsを学びたいと思うでしょう。変数名はすべて小文字で始まり、クラス名は大文字で始める必要があります。これを学んでこれに従うことで、コードをよりよく理解でき、他者のコードをよりよく理解できるようになります。

微妙な疑問2:半径フィールド(おそらく半径の名前が付けられている)は、半径ではなく直径として使用されているため、「直径」と呼ばれる必要があります。

例えば、

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class DrawCircle extends JPanel { 
    private static final int PANEL_WIDTH = 600; 
    private static final Color CIRCLE_COLOR = Color.GREEN; 
    private int posx; 
    private int posy; 
    private int diameter; 

    public DrawCircle(int posx, int posy, int diamter) { 
     setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_WIDTH)); 
     this.posx = posx; 
     this.posy = posy; 
     this.diameter = diamter; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     // for smooth graphics 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(CIRCLE_COLOR); 
     g2.fillOval(posx, posy, diameter, diameter); 
    } 

    private static void createAndShowGui() { 
     DrawCircle mainPanel = new DrawCircle(100, 100, 400); 

     JFrame frame = new JFrame("DrawCircle"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
関連する問題