2017-05-03 13 views
0

)4つのボタンのいずれかを押すたびに図を変更しようとしています。 数字はファイルを実行するたびに変わりますが、ボタンを押したときの変更方法はわかりません。
私はStrokePanelを再描画するために呼び出すことができるメソッドがありますか、それとも別の何かをしなければならないのですか?StrokePanelをJavaで再ペイントする方法(

これは、あなたが

extends JAppletが混乱事項である...

観察新しい塗装サイクルをトリガするrepaintを呼び出すために必要なコードこれまで

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.geom.*; 
import javax.swing.border.LineBorder; 

public class GeomtryQuiz extends JApplet{ 

    boolean playing = true; 
    static int chosen = 0; 
    static boolean answer = false; 
    static boolean change = false; 


    public static void main(String[] args){ 

    JFrame frame = new JFrame(); 
    frame.setTitle("Geometry Quiz"); 
    frame.setSize(1024,900); 
    frame.setBackground(Color.white); 

    JApplet applet = new GeomtryQuiz(); 
    applet.init(); 
    JButton[] buttons = new JButton[4]; 
    buttons[0] = new JButton("Triangle"); 
    buttons[1] = new JButton("Square"); 
    buttons[2] = new JButton("Pentagon"); 
    buttons[3] = new JButton("Hexagon"); 
    frame.getContentPane().add(applet); 

    Container c = frame.getContentPane(); 
    JPanel p = new JPanel(); 
    p.setLayout(new GridLayout(2,2)); 
    c.setLayout(new BorderLayout()); 

    for(int i = 0 ; i < 4; i++){ 
     buttons[i].setPreferredSize(new Dimension(70,70)); 
     buttons[i].setBackground(Color.pink); 
     final JButton b = buttons[i]; 
     final int angle = i; 
     final int n = 3; 

     b.addActionListener(

     new ActionListener(){ 

      public void actionPerformed(ActionEvent e){ 
       if(b.isEnabled()){ 
        control(angle); 
       } 
       if(!b.isEnabled()){ 
       } 
      } 
     } 
     ); 

     p.add(buttons[i]); 
    } 
    c.add(p,BorderLayout.SOUTH); 
    c.add(applet,BorderLayout.CENTER); 
    frame.setVisible(true); 
} 

public static void control(int i){ 
    if((i + 3) == chosen){ 
     JOptionPane.showMessageDialog(null,"Correct"); 


    } 
    else{ 
     JOptionPane.showMessageDialog(null,"Wrong"); 

    } 
    change = true; 
} 

public void init() { 
    JPanel panel = new StrokePanel(); 
    getContentPane().add(panel); 
} 


class StrokePanel extends JPanel { 

    public StrokePanel() { 
    setPreferredSize(new Dimension(1024,800)); 
    setBackground(Color.white); 
    } 
    public void paintComponent(Graphics f){ 

    Graphics2D g = (Graphics2D)f; 
    Point2D center = new Point2D.Float(512,250); 
    float radius = 1000; 
    float[] dist = {0.1f, 0.2f, 1.0f}; 
    Color[] colors1 = {Color.white, Color.white, Color.red}; 
    RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors1); 

    g.setPaint(p); 
    g.fillRect(0,0,1024,800); 
    int random = (int)(Math.random()*4 + 3); 

    chosen = random;  
    drawShape(g,random);   

      } 
    public void drawShape(Graphics g,int numri_brinjeve) 
    { 


    Graphics2D g2 = (Graphics2D)g; 
    g2.setStroke(new BasicStroke(2.0f)); 
    g.setColor(Color.pink); 
    g2.translate(512,250);  
    double kendi = 360.0/numri_brinjeve; 
    GeneralPath path = new GeneralPath(); 
    double a = 0; 
    double c = 0; 
    double x = 0; 
    double y = 0; 
    double r = 150; 

    for(int i = 1 ; i <= numri_brinjeve + 1 ; i++) { 

     x = r* Math.cos(Math.toRadians(i*kendi)); 
     y = r* Math.sin(Math.toRadians(i*kendi)); 

     a = x; 
     c = -y; 
     if(i == 1) 
      path.moveTo(a, c); 

     // System.out.println(i + ", " + a + ", " + c + "," + i*kendi); 
     path.lineTo(a, c); 
    } 

    g2.fill(path); 
    g2.setColor(Color.lightGray); 
    Stroke stroke = new BasicStroke(7); 
    g2.setStroke(stroke); 
    g2.draw(path); 
    } 
} 
} 

+0

あなたはコードがある枝見るために 'のSystem.out.println()'ステートメントを入れている更新します取って? – CraigR8806

+0

私はこのコードをIDEに入れました。私が飛び出した最初のものは、エラーの原因となる次の行でした: 'applet = new GeomtryQuiz();' 'Japplet applet.init();'アプレットは上記で宣言されていません。 – Sebastian

+0

申し訳ありません私は2つの別々のファイルで作業していましたが、それをチェックしませんでした。それは私が探していたものではありませんが、とにかく感謝しています。 –

答えて

1

I'm trying to make the figure change everytime i press one of the four buttons

です。原則として、自分でAppletを作成して操作するべきではありません。ブラウザプラグインによって管理されることを意図しています。

あなたのコードに基づいて、私はそれをすべて持っている本当の理由を見ることができないので、私はそれを取り除くことから始めます。

さて、これはあなたが最初のコンテンツ・ペインにappletを追加するので、あなたはおそらく

//JApplet applet = new GeomtryQuiz(); 
//applet.init(); 

frame.getContentPane().add(applet); 
//... 
c.add(p, BorderLayout.SOUTH); 
c.add(applet, BorderLayout.CENTER); 

がわかりましたし、問題の上にハイライト表示され、追加の問題を作成するために開始されますが、その後、後で再度追加します。.. ?この場合、これは実際には操作ではありませんが、問題が終了していない可能性があります。コンポーネントを一度追加するだけです。

これは、アプレット?アプレットが行っていた唯一のことは、StrokePanelを代わりに使用して、StrokePanelを追加することでした。

これは少し複雑になります。

基本的には、StrokePanelニーズはとてもchosenが実際にも、StrokePanelの財産である必要があり、それは現在の状態です維持するために、chosenpaintComponent内から変更してはいけません、これはpaintComponentとして、問題の終わりを引き起こさないだろう主にあなたの関与なしに、任意の数の理由でいつでも呼び出すことができます。だから、代わりに、あなたは私が、私は、主に、この上の再作業を少していませんでした

StrokePanel

class StrokePanel extends JPanel { 

    private int chosen = 0; 

    public StrokePanel() { 
     setPreferredSize(new Dimension(1024, 800)); 
     setBackground(Color.white); 
    } 

    public int getChosen() { 
     return chosen; 
    } 

    public void setChosen(int chosen) { 
     this.chosen = chosen; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics f) { 
     super.paintComponent(f); 
     Graphics2D g = (Graphics2D) f; 
     Point2D center = new Point2D.Float(512, 250); 
     float radius = 1000; 
     float[] dist = {0.1f, 0.2f, 1.0f}; 
     Color[] colors1 = {Color.white, Color.white, Color.red}; 
     RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors1); 

     g.setPaint(p); 
     g.fillRect(0, 0, 1024, 800); 
     drawShape(g, getChosen()); 

    } 

    public void drawShape(Graphics g, int numri_brinjeve) { 

     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(2.0f)); 
     g.setColor(Color.pink); 
     g2.translate(512, 250); 
     double kendi = 360.0/numri_brinjeve; 
     GeneralPath path = new GeneralPath(); 
     double a = 0; 
     double c = 0; 
     double x = 0; 
     double y = 0; 
     double r = 150; 

     for (int i = 1; i <= numri_brinjeve + 1; i++) { 

      x = r * Math.cos(Math.toRadians(i * kendi)); 
      y = r * Math.sin(Math.toRadians(i * kendi)); 

      a = x; 
      c = -y; 
      if (i == 1) { 
       path.moveTo(a, c); 
      } 

      // System.out.println(i + ", " + a + ", " + c + "," + i*kendi); 
      path.lineTo(a, c); 
     } 

     g2.fill(path); 
     g2.setColor(Color.lightGray); 
     Stroke stroke = new BasicStroke(7); 
     g2.setStroke(stroke); 
     g2.draw(path); 
    } 
} 

GeomtryQuiz

その値を設定および取得するためにいくつかの方法が必要になりますJAppletを削除し、コアアプリケーションをstaticコンテキスト(ペット嫌い)から移動しました。

メジャーアップデートは、ランダムな形状を生成update方法、を含めることで、StrokePanel

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class GeomtryQuiz { 

    boolean playing = true; 
    boolean answer = false; 
    boolean change = false; 

    private StrokePanel strokePanel; 

    public static void main(String[] args) { 
     new GeomtryQuiz(); 
    } 

    public GeomtryQuiz() { 

     JFrame frame = new JFrame(); 
     frame.setTitle("Geometry Quiz"); 
     frame.setSize(1024, 900); 
     frame.setBackground(Color.white); 

     JButton[] buttons = new JButton[4]; 
     buttons[0] = new JButton("Triangle"); 
     buttons[1] = new JButton("Square"); 
     buttons[2] = new JButton("Pentagon"); 
     buttons[3] = new JButton("Hexagon"); 

     Container c = frame.getContentPane(); 
     JPanel p = new JPanel(); 
     p.setLayout(new GridLayout(2, 2)); 

     for (int i = 0; i < 4; i++) { 
      buttons[i].setPreferredSize(new Dimension(70, 70)); 
      buttons[i].setBackground(Color.pink); 
      final JButton b = buttons[i]; 
      final int angle = i; 
      final int n = 3; 

      b.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (b.isEnabled()) { 
         control(angle); 
        } 
        if (!b.isEnabled()) { 
        } 
       } 
      }); 

      p.add(buttons[i]); 
     } 
     c.add(p, BorderLayout.SOUTH); 

     strokePanel = new StrokePanel(); 
     c.add(strokePanel, BorderLayout.CENTER); 
     update(); 
     frame.setVisible(true); 
    } 

    protected void update() { 
     int last = strokePanel.getShape(); 
     int random = last; 
     do { 
      random = (int) (Math.random() * 4 + 3); 
     } while (random != last); 
     strokePanel.setShape(random); 
    } 

    public void control(int i) { 
     if ((i + 3) == strokePanel.getShape()) { 
      JOptionPane.showMessageDialog(null, "Correct"); 
      update(); 
     } else { 
      JOptionPane.showMessageDialog(null, "Wrong"); 

     } 
     change = true; 
    } 
} 
+0

すべてをありがとうが、私はコードを試しましたが、コードは実行されません。 。 –

+0

投稿した(そしてテストした)例に基づいて、それは私のためにうまくいきます – MadProgrammer

関連する問題