2013-04-08 67 views
0

因此,我无法对框架进行居中,因此我的整个图形都显示在屏幕上。目前,当我运行我的程序时,坐标系上的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); 
} 

}

西格玛方法我打电话了在不同的类,这里是该代码: 公共类西格玛{

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

} 

我老实说不知道如何正确对齐,我是否缺少一种方法?我一直在搞变数,他们似乎并没有改变帧的居中。 非常感谢!

回答

0

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

西格玛级

这里是我的版本西格玛类的。

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类

这里是我的版本GraphSigma类的。

您总是在Event Dispatch Thread(EDT)上调用Swing应用程序。这可以防止问题。

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

有了这些信息,我专注于绘图代码中的翻译和缩放方法。

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

} 
相关问题