2013-03-03 2 views
-2

나는 아래의 링크에서 막대 차트를 만들기위한 소스 코드를 가지고 - 스윙 프로그램을 MVC 형식으로 변환하는 방법은 무엇입니까?

Bar chart in java

나는 항목과 해당 값을 저장하는 모델 클래스를했다. 그런 다음 모델을 가져 와서 막 대형 차트로 표시해야하는 패널 클래스를 만들었습니다. 그런 다음 패널을 내용 창에 추가하는 프레임 클래스를 만들었습니다. 그런 다음, 링크에서 주어진 코드와 똑같이 모든 것을 실행해야하는 드라이버 클래스를 만들었습니다.

문제는 내 프레임과 막 대형 차트 만 표시된다는 것입니다. 어떻게 해결할 수 있습니까?

나는 너무 큽니다 때문에 의도적으로 내 코드를 포함하지 않았습니다. 하지만, 여기에 넣어야한다고 생각한다면 나에게 말해줘. 당신이 위에 표시된

class SimpleBarChartModel { 
    private String[] items; 
    private double[] valuesOfItems; 
    private String title; 

    public SimpleBarChartModel(String[] itemList, double[] valueList, 
     String title) { 
     String[] items = itemList; // **** here 
     double[] valuesOfItems = valueList; // **** here 
    } 

은 다음과 같습니다 -

package myArea; 

public class SimpleBarChartModel{ 

private String[] items; 
private double[] valuesOfItems; 
private String title; 

public SimpleBarChartModel(String[] itemList, double[] valueList, String title){ 

    String[] items = itemList; 
    double[] valuesOfItems = valueList; 

} 

public String[] getItems(){ 
    return items; 
} 

public void setItems(String[] items){ 
    this.items = items; 
} 

public double[] getValuesOfItems(){ 
    return valuesOfItems; 
} 

public void setValuesOfItems(double[] valuesOfItems){ 
    this.valuesOfItems = valuesOfItems; 
} 

public String getTitle(){ 
    return title; 
} 

public void setTitle(String title){ 
    this.title = title; 
} 


} 


package myArea; 

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

public class SimpleBarChartPanel extends JPanel{ 

SimpleBarChartModel bChartMdl; 

public SimpleBarChartPanel(SimpleBarChartModel bcMdl){ 

    bChartMdl = bcMdl; 

} 

public void paintComponent(Graphics graphics) { 

//Must always be the first line in paintComponent method 
super.paintComponent(graphics); 
double[] values = bChartMdl.getValuesOfItems(); 
String[] items = bChartMdl.getItems(); 
String title = bChartMdl.getTitle();  

if (values == null || values.length == 0) 
return; 

double minValue = 0; 
double maxValue = 0; 

for (int i = 0; i < values.length; i++) { 
    if (minValue > values[i]){ 

     minValue = values[i]; 
    } 

    if (maxValue < values[i]){ 

     maxValue = values[i]; 
    } 

} 

Dimension dim = getSize(); 
int clientWidth = dim.width; 
int clientHeight = dim.height; 
int barWidth = clientWidth/values.length; 
Font titleFont = new Font("Book Antiqua", Font.BOLD, 15); 
FontMetrics titleFontMetrics = graphics.getFontMetrics(titleFont); 
Font labelFont = new Font("Book Antiqua", Font.PLAIN, 10); 
FontMetrics labelFontMetrics = graphics.getFontMetrics(labelFont); 
int titleWidth = titleFontMetrics.stringWidth(title); 
int q = titleFontMetrics.getAscent(); 
int p = (clientWidth - titleWidth)/2; 
graphics.setFont(titleFont); 
graphics.drawString(title, p, q); 
int top = titleFontMetrics.getHeight(); 
int bottom = labelFontMetrics.getHeight(); 

if (maxValue == minValue){ 
    return; 
} 


double scale = (clientHeight - top - bottom)/(maxValue - minValue); 
q = clientHeight - labelFontMetrics.getDescent(); 
graphics.setFont(labelFont); 

for (int j = 0; j < values.length; j++) { 
    int valueP = j * barWidth + 1; 
    int valueQ = top; 
    int height = (int) (values[j] * scale); 

    if (values[j] >= 0){ 

     valueQ += (int) ((maxValue - values[j]) * scale); 
}else{ 
     valueQ += (int) (maxValue * scale); 
     height = -height; 
} 

     graphics.setColor(Color.blue); 
     graphics.fillRect(valueP, valueQ, barWidth - 2, height); 
     graphics.setColor(Color.black); 
     graphics.drawRect(valueP, valueQ, barWidth - 2, height); 
     int labelWidth = labelFontMetrics.stringWidth(items[j]); 
     p = j * barWidth + (barWidth - labelWidth)/2; 
     graphics.drawString(items[j], p, q); 

    } 

} 


} 


package myArea; 

import javax.swing.*; 

public class SimpleBarChartView extends JFrame{ 

SimpleBarChartPanel bChartPanel; 

public SimpleBarChartView(SimpleBarChartPanel bcPanel, int width, int height){ 

    bChartPanel = bcPanel; 
    this.setSize(width, height); 
    this.getContentPane().add(bChartPanel); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

} 


package myArea; 

public class SimpleBarChartDriver { 

public static void main(String[]args){ 

    double[] value= new double[5]; 
    String[] languages = new String[5]; 

    value[0] = 1; 
    languages[0] = "Visual Basic"; 

    value[1] = 2; 
    languages[1] = "PHP"; 

    value[2] = 3; 
    languages[2] = "C++"; 

    value[3] = 4; 
    languages[3] = "C"; 

    value[4] = 5; 
    languages[4] = "Java"; 

      SimpleBarChartModel sBModel = 
      new SimpleBarChartModel(languages,value,"comp languages"); 
    SimpleBarChartPanel sBPanel = new SimpleBarChartPanel(sBModel); 
    SimpleBarChartView sbView = new SimpleBarChartView(sBPanel, 500, 500); 
    sbView.setVisible(true);  
} 

} 

UPDATE 난 당신이 클래스에서 변수를 미행하는

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at sun.font.FontDesignMetrics.stringWidth(Unknown Source) 
+1

다른 사용자의 득표를 제어 할 수 없습니다. –

+0

* "그런 다음 모델을 가져와 막 대형 차트로 표시하는 패널 클래스를 만들었습니다."* OK. 하지만 왜 패널을 확장하는 것보다는 인스턴스를 사용하는 것이 좋을까요? * "아래 링크에서 막대 그래프를 만들기위한 소스 코드가 있습니다. http : //www.roseindia.noooo ..... 제발 말해주십시오. 투표를하지 마십시오."* 투표를 통해 RoseIndia에서 유래 된 코드를 수정하거나 보도록 요청한 것일 수도 있습니다 (또는 대담한 행동을 지시하는 경우). –

+1

나는 당신이 우리가 문제를 이해할 수 있도록 충분한 정보를 제공하지 않았기 때문에 귀하의 현재 답변이 답변되지 않았다고 우려합니다. 코드를 잘못 작성했다고 말하면서 코드를 볼 수 없습니다. 가장 좋은 방법은 먼저 문제를 격리 한 다음 문제를 해결하지 않고 문제가되는 코드를 제시하는 것입니다. 그렇지 않으면이 질문이 닫힐 것입니다. –

답변

3

드라이버 클래스를 실행할 때이 내가 얻을 오류입니다 클래스 필드를 다시 선언하면 실제 필드는 null로 유지됩니다. 당신이 당신의 NullPointerException이 얻을 예외를 throw 라인을 확인할 때

class SimpleBarChartModel { 
    private String[] items; 
    private double[] valuesOfItems; 
    private String title; 

    public SimpleBarChartModel(String[] itemList, double[] valueList, 
     String title) { 
     items = itemList; // **** here 
     valuesOfItems = valueList; // **** here 

     // !! missing something else here !! ;-) 
    } 

다음 :이 솔루션은 필드를 다시 선언하지만, 클래스 필드를 사용하지 않는 것입니다. 변수 중 하나가 초기화되지 않았으므로 초기화되도록 코드를 수정해야합니다.

+0

오, 어리석은 me :(나는 그 오류를 수정했다. 그러나 지금 Nulll 포인터 예외가 생겼다. 지금 내 질문에 언급했다. 제발 고칠 수 있도록 도와주세요. – SuperStar

+0

@SuperStar : 오 바보 당신, 이미 NPE 언급 내 대답과 내 두 번째 코드 블록에서 자사의 솔루션에 대한 힌트를 준 –

+0

DUHHHHH .... :(왜 그런 어리석은 오류를 확인합니까 :(덕분에 호버 크라프트 ... 어쩌면 내가 가득한 양동이에 내 머리를 집어 넣을 필요가있다. 장어 : P – SuperStar

관련 문제