2013-04-08 2 views
0

에서 올바른 프레임 센터링을 얻으므로 프레임을 중앙에 배치하는 데 문제가있어서 전체 그래프가 화면에 표시됩니다. 현재 프로그램을 실행할 때 좌표계의 x 값은 정확한 범위이지만 프레임이 그래프가 그려지는 수백 픽셀 위의 중앙에 위치하기 때문에 그래프를 간신히 볼 수 있습니다. 공용 클래스 시그마 {그래픽 패키지

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

} 

I :

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

}

내가 불러 오전 시그마 방법은 다른 클래스에있다가, 여기에 코드입니다 : 여기 내 코드입니다 정직하게 이것을 정확히 센터링하는 법을 모르겠다. 나는 방법이 없다? 나는 변수를 망치고 있었고 프레임이 어떻게 중심에 위치 하는지를 바꾸지 않는 것 같습니다. 정말 고마워!

답변

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 클래스의 내 버전입니다.

이벤트 발송 스레드 (EDT)에서 항상 Swing 응용 프로그램을 호출합니다. 이렇게하면 문제가 발생하지 않습니다.

그래프 문제가 처음에는 볼 수 없으므로 drawLine 메서드에 대한 디버그 표시 방법을 추가했습니다. 이것은 당신이 (1,1)과 (497,576) 사이에 선을 그리는 것을 보여 줬습니다.

이 정보를 사용하여 드로잉 코드의 번역 및 크기 조정 방법에 중점을 두었습니다.

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

}