簡體   English   中英

如何在Java中重新繪制()StrokePanel

[英]How to repaint() a StrokePanel in java

每當我按四個按鈕之一時,我都在嘗試改變數字。 每當我運行文件時,圖形確實會更改,但是當我按下按鈕時,我不知道如何更改它。
我可以調用一種方法來重繪StrokePanel還是必須做其他事情?

這是到目前為止的代碼

 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);
  }  
 }
}

我試圖每次按下四個按鈕之一時改變身材

您需要調用repaint以觸​​發新的繪制周期

觀察...

extends JApplet令人困惑。 通常,您不應自己創建和操作Applet ,它們應由瀏覽器插件管理。

根據您的代碼,我看不出有任何真正的理由擁有這一切,因此我將首先擺脫它。

現在,這將開始產生其他問題,突出顯示您可能遇到的問題

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

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

好的,因此您首先將applet添加到內容窗格中,但是稍后再添加它...? 在這種情況下,這實際上是一個空操作,但可能不會引起任何問題,請確保只添加一次組件

但這提出了下一個問題,用什么代替小程序? 好吧,由於小程序唯一要做的就是向其中添加StrokePanel ,所以很簡單,只需使用StrokePanel

這會使事情變得更加復雜。

基本上, StrokePanel需要保持它的當前狀態,所以chosen實際上應該是的屬性StrokePanel ,也chosen 不應該從內修改paintComponent ,這將導致沒有問題的結束,因為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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM