在图形包中获得正确的框架中心

时间:2013-04-08 15:01:24

标签: java graphics

所以我在框架中心时遇到了麻烦,因此我的整个图形都在屏幕上。目前,当我运行程序时,坐标系上的x值是正确的范围,但我几乎看不到我的图形,因为框架位于绘制图形的上方数百个像素的中心。这是我的代码:

public static int startx = 1;
public static int endx = 500;
static Scanner input = new Scanner(System.in);

int WIDTH = 0;  
int HEIGHT = 0;


public GraphSigma(int WIDTH, int HEIGHT) {
    this.WIDTH = WIDTH;
    this.HEIGHT = HEIGHT;
}

// Draw your spiral here!!!
// You'll need to use a FOR loop to calculate the
// points on the spiral


public void paintSigma(Graphics g){

    int prevX=startx;
    int prevY=Sigma.Sigma(startx);
     Graphics2D g2 = (Graphics2D) g;
    g2.translate(0, Sigma.Sigma(endx));
    g2.scale(1,-1);
    if (endx-startx < 50)
        for (int i = startx; i <= endx; i++) {
            int x = i;
            int y = Sigma.Sigma(i);
            g.drawLine(0+prevX, 0+prevY, x, y);
            prevX=x;
            prevY=y;

            };
    if (51 < endx-startx && endx-startx < 300)
        for (int i = startx; i <= endx; i+=2) {
        int x = i;
        int y = Sigma.Sigma(i);
        g.drawLine(0+prevX, 0+prevY, x, y);
        prevX=x;
        prevY=y;

        };
        if (301 < endx-startx  && endx-startx < 1000)
        for (int i = startx; i <= endx; i+=4) {
            int x = i;
            int y = Sigma.Sigma(i);
            g.drawLine(0+prevX, 0+prevY, x, y);
            prevX=x;
            prevY=y;

        };
        if (1000<endx-startx)
            for (int i = startx; i <= endx; i+=10) {
                int x = i;
                int y = Sigma.Sigma(i);
                g.drawLine(0+prevX, 0+prevY, x, y);
                prevX=x;
                prevY=y;

                };

}

// This special method is automatically called when the scene needs to be drawn.
public void paintComponent(Graphics g) {

    paintSigma(g);
}

public static void main(String[] args) {
    // Graphics window size

    int WINDOW_WIDTH = endx-startx+20;
    int WINDOW_HEIGHT = endx;

    JFrame frame = new JFrame();

    frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);

    frame.setTitle("Sigma Function");

    GraphSigma d = new GraphSigma(endx-startx+20, Sigma.Sigma(endx));
    frame.add(d);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

我正在调用的sigma方法是在另一个类中,这是代码: 公共阶级西格玛{

static Scanner input = new Scanner(System.in);

public static int Sigma(int s){
    int a = 0;
    for(int i=1;i<=s;i++){
        if(s%i==0)
            a = a + i;

    }
    return a;

}
public static void main(String[] args) {
    System.out.println("Please enter the number you want to perform the sigma function on");
    int s = input.nextInt();
    System.out.print(Sigma.Sigma(s) +" is the sum of all the divisors of your input" ); 
    }

}

老实说,我不知道如何正确地居中,我错过了一个方法吗?我一直在搞乱变量,它们似乎并没有改变框架的居中方式。 非常感谢!

1 个答案:

答案 0 :(得分:0)

首先,让我们清理你的代码,然后我会告诉你哪里出错了。

Sigma Class

这是我的Sigma课程版本。

1)您没有将方法命名为与类名相同的方法。我将您的方法名称更改为calculateSigma。

2)当您打开扫描仪时,请在完成后将其关闭。

3)永远不要像你那样在课堂上定义和打开扫描仪变量。特别是你调用calculateSigma方法的次数。

import java.util.Scanner;

public class Sigma {

    public static int calculateSigma(int s) {
        int a = 0;
        for (int i = 1; i <= s; i++) {
            if (s % i == 0)
                a = a + i;
        }
        return a;
    }

    public static void main(String[] args) {
        Scanner input   = new Scanner(System.in);
        System.out.println("Please enter the number you want " +
                "to perform the sigma function on");
        int s = input.nextInt();
        System.out.print(Sigma.calculateSigma(s)
                + " is the sum of all the divisors of your input");
        input.close();
    }

}

GraphSigma Class

这是我的GraphSigma类版本。

您始终在事件调度线程(EDT)上调用Swing应用程序。这可以防止出现问题。

我最初看不到图形问题,所以我为drawLine方法添加了一个调试显示方法。这表明你正在绘制(1,1)和(497,576)之间的界限。

通过这些信息,我专注于绘图代码中的translate和scale方法。

translate方法移动图形的原点。

缩放方法通过将计算出的坐标乘以一个因子来将计算出的坐标转换为图形坐标,以获得图形坐标。

我解决问题的第一件事是更改我用来调用translate方法的数字,将图形的原点移动到JPanel的左下角。

我做的第二件事就是找出缩放因子,以便图形适合JPanel。调试信息让我相信我的缩放因子是正确的。

我将调试代码留在了类中,这样你(和其他人)就可以看到一种调试Java类的方法,并找出自己出错的方法。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GraphSigma extends JPanel {

    public static boolean   DEBUG   = false;

    public static int       startx  = 1;
    public static int       endx    = 500;
    static Scanner          input   = new Scanner(System.in);

    int                     WIDTH   = 0;
    int                     HEIGHT  = 0;

    public GraphSigma(int WIDTH, int HEIGHT) {
        this.WIDTH = WIDTH;
        this.HEIGHT = HEIGHT;
    }

    // Draw your spiral here!!!
    // You'll need to use a FOR loop to calculate the
    // points on the spiral

    public void paintSigma(Graphics g) {

        int prevX = startx;
        int prevY = Sigma.calculateSigma(startx);
        Graphics2D g2 = (Graphics2D) g;
        if (DEBUG) {
            System.out.println("Sigma of endx: " 
                    + Sigma.calculateSigma(endx));
        }
        g2.translate(0, this.getHeight());
        g2.scale(1, -((double) this.getHeight()) / 
                Sigma.calculateSigma(endx));
        if (endx - startx < 50)
            for (int i = startx; i <= endx; i++) {
                int x = i;
                int y = Sigma.calculateSigma(i);
                if (DEBUG) {
                    debugOutput(0 + prevX, 0 + prevY, x, y);
                }
                g.drawLine(0 + prevX, 0 + prevY, x, y);
                prevX = x;
                prevY = y;

            }
        ;
        if (51 < endx - startx && endx - startx < 300)
            for (int i = startx; i <= endx; i += 2) {
                int x = i;
                int y = Sigma.calculateSigma(i);
                if (DEBUG) {
                    debugOutput(0 + prevX, 0 + prevY, x, y);
                }
                g.drawLine(0 + prevX, 0 + prevY, x, y);
                prevX = x;
                prevY = y;

            }
        ;
        if (301 < endx - startx && endx - startx < 1000)
            for (int i = startx; i <= endx; i += 4) {
                int x = i;
                int y = Sigma.calculateSigma(i);
                if (DEBUG) {
                    debugOutput(0 + prevX, 0 + prevY, x, y);
                }
                g.drawLine(0 + prevX, 0 + prevY, x, y);
                prevX = x;
                prevY = y;

            }
        ;
        if (1000 < endx - startx)
            for (int i = startx; i <= endx; i += 10) {
                int x = i;
                int y = Sigma.calculateSigma(i);
                if (DEBUG) {
                    debugOutput(0 + prevX, 0 + prevY, x, y);
                }
                g.drawLine(0 + prevX, 0 + prevY, x, y);
                prevX = x;
                prevY = y;

            }
        ;

    }

    private void debugOutput(int x1, int y1, int x2, int y2) {
        System.out.println("Line drawn from (" + x1 + "," + y1 + ") to (" + x2
                + "," + y2 + ").");
    }

    // This special method is automatically called when the scene needs to be
    // drawn.
    @Override
    public void paintComponent(Graphics g) {
        paintSigma(g);
    }

    public static void main(String[] args) {
        // Graphics window size
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
        int WINDOW_WIDTH = endx - startx + 20;
        int WINDOW_HEIGHT = endx;

        JFrame frame = new JFrame();

        frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);

        frame.setTitle("Sigma Function");

        GraphSigma d = new GraphSigma(endx - startx + 20,
                Sigma.calculateSigma(endx));
        frame.add(d);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}