有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组件生成的矩形太多

我对paintComponent有问题。我使用“while”循环来绘制矩形。下一个矩形应更小并旋转。它是有效的。但paintComponent执行两次,而不是像我预期的那样执行一次。我该怎么办

在那里您可以找到完整的代码:

梅因。爪哇:

 import java.awt.*;

    public class Main {


        public static void main(String[] args) {
            new Kalejdoskop(600, 600,    
                    5,         
                    Color.YELLOW,
                    Color.GREEN,  
                    1, 5);      
        }
    }

我的小组。爪哇:

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

/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 07.04.13
 * Time: 01:34
 * To change this template use File | Settings | File Templates.
 */
public class MyPanel extends JPanel {
    int szerokoscOkna = Kalejdoskop.szerokoscOkna;
    int wysokoscOkna = Kalejdoskop.wysokoscOkna;
    double kat = 90;
    double wspolczynnik = kat * Kalejdoskop.stosunekWspolczynnika1 / Kalejdoskop.stosunekWspolczynnika2;

    public MyPanel() {
        setPreferredSize(new Dimension(szerokoscOkna, wysokoscOkna));
    }





    protected void paintComponent(Graphics g) {
        System.out.println(Kalejdoskop.kwadraty);

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        int verticalCenter = this.getHeight() / 2;


        double rogKwadratu = verticalCenter - (szerokoscOkna / 2);
        double bok = szerokoscOkna;
        int i = 0;
        int jakiKolor = 0;


        Rectangle2D kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, szerokoscOkna, szerokoscOkna);
        g2d.setPaint(Kalejdoskop.pierwszyKolor);
        g2d.fill(kwad);


        while (i < Kalejdoskop.kwadraty) {
            if (jakiKolor == 0) {
                bok = (bok * Math.tan(Math.toRadians(wspolczynnik))) / ((Math.sin(Math.toRadians(wspolczynnik))) * (1 + Math.tan(Math.toRadians(wspolczynnik))));
                rogKwadratu = verticalCenter - (bok / 2);


                g2d.rotate(Math.toRadians(wspolczynnik), szerokoscOkna / 2, szerokoscOkna / 2);
                kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, bok, bok);


                g2d.setPaint(Kalejdoskop.drugiKolor);

                g2d.fill(kwad);


                jakiKolor = 1;
            }


            if (jakiKolor == 1) {
                bok = (bok * Math.tan(Math.toRadians(wspolczynnik))) / ((Math.sin(Math.toRadians(wspolczynnik))) * (1 + Math.tan(Math.toRadians(wspolczynnik))));
                rogKwadratu = verticalCenter - (bok / 2);


                g2d.rotate(Math.toRadians(wspolczynnik), szerokoscOkna / 2, szerokoscOkna / 2);
                kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, bok, bok);


                g2d.setPaint(Kalejdoskop.pierwszyKolor);

                g2d.fill(kwad);


                jakiKolor = 0;
            }

            i++;
        }


    }

}

我的框架。爪哇:

import javax.swing.*;


/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 07.04.13
 * Time: 01:33
 * To change this template use File | Settings | File Templates.
 */
public class MyFrame extends JFrame {
    public MyFrame() {
        super("Kalejdoskop");
        JPanel panel = new MyPanel();

        add(panel);

        pack();


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

卡莱杜斯科普。爪哇:

import javax.swing.*;
import java.awt.*;
import java.awt.EventQueue;
import java.awt.geom.Rectangle2D;

/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 06.04.13
 * Time: 20:52
 * To change this template use File | Settings | File Templates.
 */


class Kalejdoskop extends JPanel {
    static int szerokoscOkna = 0;
    static int wysokoscOkna = 0;
    static int kwadraty = 0;
    static Color pierwszyKolor = Color.RED;
    static Color drugiKolor = Color.YELLOW;
    static int stosunekWspolczynnika1 = 0;
    static int stosunekWspolczynnika2 = 0;


    public Kalejdoskop(int szerokosc, int wysokosc, int liczbaKwadratow, Color a, Color b, int stosunek1, int stosunek2) {

        szerokoscOkna = szerokosc;
        wysokoscOkna = wysokosc;
        kwadraty = liczbaKwadratow;
        pierwszyKolor = a;
        drugiKolor = b;
        stosunekWspolczynnika1 = stosunek1;
        stosunekWspolczynnika2 = stosunek2;



           jedziesz();



    }


    public static void jedziesz(){

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new MyFrame();
            }
        });

    }

}

共 (1) 个答案

  1. # 1 楼答案

    你说:

    I've got a problem with paintComponent. I use "while" loop to draw rectangles. Every next rectangle should be smaller and rotated. And it works. But paintComponent executes 2 times, not once as I expect. What should I do?

    从那以后你什么都不应该做

    1. 您无法直接控制调用paintComponent(...)的时间、条件或频率。您的代码可以假设它在GUI组件呈现时至少被调用一次,然后如果您通过repaint()建议调用它,则可以调用它,但根据Java API,这并不保证它会被调用,特别是在重绘“堆叠”的情况下
    2. paintComponent(...)方法中不应该有程序逻辑
    3. 如果遵守了这一点,您的代码就不应该真正关心paintComponent(...)是否被调用了两次或更多次

    换句话说,如果您的代码构造正确,那么这确实不是问题