2016-05-25 6 views
0

私は、この質問がコピーになることはほぼ保証できると言い始めるつもりですが、自分のニーズに合った答えは私のプログラムではうまくいきませんでした。私はJPanelに描画する必要がありますが、表示するために描画する必要がある行を得ることができないようです。困っていることJPanel

JFrame drawF = new JFrame("Simulator"); 
     JPanel simPanel = new JPanel(); 
     drawF.setVisible(true); 
     drawF.setSize(1000,650); 
     drawF.add(simPanel); 
     drawF.pack(); 
     simPanel.setLayout(null); 
     simPanel.setSize(1000,650); 
     simPanel.setVisible(true); 
     simPanel.setBackground(Color.BLACK); 

     //add drawing surface 


     //start drawing 
      simPanel.add(new JComponent() 
      { 
      public void paint(Graphics g) 
      { 
       g.setColor(Color.RED); 
       int xLast,yLast; 
       for(int i=0;i < 5000000; i++) // five million 
       { 

        double dX = (Math.E*Math.exp(-numd1*i)*Math.sin(i*numf1+nump1))+(Math.E*Math.exp(-numd2*i)*Math.sin(i*numf2*nump2)); 
        double dY = (Math.E*Math.exp(-numd3*i)*Math.sin(i*numf3+nump3))+(Math.E*Math.exp(-numd4*i)*Math.sin(i*numf4*nump4)); 
        int drawX = (int)dX; 
        int drawY = (int)dY; 
        if (i==0) 
        { 
         xLast = 0; 
         yLast = 0; 
         g.drawLine(xLast,yLast,drawX,drawY); 

         simPanel.revalidate(); 
         simPanel.repaint(); 
        } 
        else 
        { 
         xLast = drawX; 
         yLast = drawY; 
         g.drawLine(xLast,yLast,drawX,drawY); 

         simPanel.revalidate(); 
         simPanel.repaint(); 
        } 
       } 
      } 
     }); 





     repaint(); 

JPanelJComponentを追加することに何か問題はありますか?

+0

?なぜあなたはあなたの計算で 'Math.E'を使用していて、同じ数(オイラーの定数、e)に何らかの力を掛けて乗算していますか? –

+0

申し訳ありませんが、私は忙しかったです。私は調和グラフをシミュレートしています。 –

+0

ああ、ところで、これは明らかにもっと大きなプログラムの一部に過ぎません。 –

答えて

2

あなたの問題は、レイアウトマネージャの可能性が高いです。 JPanelはデフォルトでFlowLayoutを使用しているため、JComponentは[0、0]という自然な優先サイズにサイズ変更されるため、この状況では何も表示されません。 JPanelのレイアウトBorderLayoutを作成し、JComponent BorderLayout.CENTERを追加してください。

その他の問題:

  • 上書きJComponentのpaintComponentメソッドではなく、塗装方法は、そうでない場合は、アカウントに国境や子どもたちの絵を取っていないことにより、予期せぬ副作用を危険にさらします。
  • 私が推奨するpaintComponentをオーバーライドする場合は、オーバーライドでsuperのペインティングメソッドsuper.paintComponent(g);を呼び出します。これは、汚れたピクセルをきれいにするのに役立ちます。
  • repaintおよびrevalidateおよびsetVisibleへの不要な呼び出しをすべて削除します。
  • の後に、JFrameのsetVisibleをに呼び出して、すべてのコンポーネントをGUIに追加します。
  • 私自身は、バックグラウンドを自動的に描画しないので、JComponentではなく、JPanelのpaintComponentメソッド内にペイントしたいと思う。
  • 私は匿名の内部クラスに埋め込まれていない独自のスタンドアローンのクラスで自分の絵を好む。このような方法で埋葬することはあまりにも重要な機能です。
  • ペインティングメソッドで呼び出す時間が長くなる、またはCPUが強くなればなるほど、GUIの応答性は低下します。あなたのクラスのコンストラクタと描画メソッドのforループと数学計算をオフにします。結果を配列またはリストに格納するか、またはBufferedImageにペイントし、そのイメージをpaintComponentメソッド内に表示する場合は、結果を配列またはリストに格納します。たとえば、

:あなたが描くしようとしているどのような式

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

@SuppressWarnings("serial") 
public class DrawingStuff extends JPanel { 
    private static final int PREF_W = 1000; 
    private static final int PREF_H = 650; 
    private static final Color BG = Color.BLACK; 
    private static final Color GRAPHICS_COLOR = Color.RED; 
    private static final int LOOP_COUNT = 5000000; // 5 million 

    private BufferedImage image = null; 
    private MathParams[] params; 

    public DrawingStuff(MathParams[] params) { 
     this.params = params; 
     setBackground(BG); 
     image = drawImage(); 
    } 

    private BufferedImage drawImage() { 
     BufferedImage img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 

     g2.setColor(GRAPHICS_COLOR); 
     int xLast, yLast; 
     for (int i = 0; i < LOOP_COUNT; i++) { 
      double dX = params[0].doCalc0(i) + params[1].doCalc1(i); 
      double dY = params[2].doCalc0(i) + params[3].doCalc1(i); 
      int drawX = (int) dX; 
      int drawY = (int) dY; 
      if (i == 0) { 
       xLast = 0; 
       yLast = 0; 
       g2.drawLine(xLast, yLast, drawX, drawY); 
      } else { 
       xLast = drawX; 
       yLast = drawY; 
       g2.drawLine(xLast, yLast, drawX, drawY); 
      } 
     } 

     g2.dispose(); 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
      g.drawImage(image, 0, 0, this); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Drawing Stuff"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // TODO: fix this -- what numbers to use??? These don't work 
     MathParams[] paramArray = { 
       new MathParams(1, 2, 3), 
       new MathParams(1, 2, 3), 
       new MathParams(3, 4, 5), 
       new MathParams(3, 4, 5) 
       }; 

     frame.getContentPane().add(new DrawingStuff(paramArray)); 
     frame.setResizable(false); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

public class MathParams { 
    private int numd; 
    private int numf; 
    private int nump; 

    public MathParams(int numd, int numf, int nump) { 
     this.numd = numd; 
     this.numf = numf; 
     this.nump = nump; 
    } 

    public double doCalc0(int i) { 
     return (Math.E * Math.exp(-numd * i) * Math.sin(i * numf + nump)); 
    } 

    public double doCalc1(int i) { 
     return (Math.E * Math.exp(-numd * i) * Math.sin(i * numf * nump)); 
    } 
} 
+0

ありがとうございます、私はこれを試して、あなたに知らせる –

+0

@ MarkCoats:コードはちょうどFYIと私はあなたがグラフにしようとしているか、どのパラメータが正しいのか分からないので "仕事"を意味しません。列挙された概念は**正しい**は**動作し、あなたの質問に対する実際の答えです。 –

+0

num変数に数字(1,2,3,4)を使用すると、振り子1のxとyの値と振り子の2つのxとyの値を区別できます(数字があなたの –

関連する問題