3

私は一言で言えば次のことを行うプロジェクトをやっています:

  1. ファイルから整数を読み取ります
  2. それらを配列に格納します
  3. 平均線で数値の棒グラフを作成します
  4. 平均より上の数字は上がり、下の数字は下がります(どちらも異なる色です)

正しくコンパイルされ、JFrameウィンドウがポップアップしますが、データは出力されません。それはただの空のウィンドウです。

これが私のコードです:

package basicgraphicstester;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;

public class BasicGraphicsTester extends JFrame {
    private Image fImageBuffer;
    private Insets fInsets;
    private Graphics g;
    private static final int WIDTH = 800, HEIGHT = 600;
    private static final Color OVER_AVERAGE = Color.blue, 
        UNDER_AVERAGE = Color.red;
    int[] data;


public BasicGraphicsTester() throws FileNotFoundException
{   ReadInputData();
    addWindowListener(new WindowCloser());
    setVisible(true);
    fInsets = getInsets();
    setSize(WIDTH + fInsets.left + fInsets.right, HEIGHT + fInsets.top +fInsets.bottom);
    setTitle("Bar Graph");
    setResizable(false);
    if (((fImageBuffer = createImage(WIDTH, HEIGHT)) != null) &&
        ((g = fImageBuffer.getGraphics()) != null)) Run();
    else System.exit(1);
}

class WindowCloser extends WindowAdapter
{   public void WindowClosing(WindowEvent e )
    {   System.exit(0); }   
}

private void Run()
{   DrawAverageLine();
    DrawBars();

}


private void DrawBars() 
{   
    double arrayAverage = arrayAverage(data);
    int average = averageLine(data);
    int max = getMaxValue(data);
    int min = getMinValue(data);
    int barWidth = 57;
    double barHeight;

    for (int i = 0; i < data.length; i++) {
    barHeight = (600 * (max - data[i]))/(max - min);
    if (data[i] > average) {
        g.setColor(OVER_AVERAGE);
        g.fillRect((int)barWidth * i, (int)barHeight, (int)barWidth, 
            (average - (int)barHeight));
    }
    else if (barHeight == average) {
        g.setColor(Color.green);
        g.fillRect((int)barWidth * i, average, (int)barWidth, 0);
    }
    else {
        g.setColor(UNDER_AVERAGE);
        g.fillRect((int)barWidth * i, average, (int)barWidth, 
            ((int)barHeight - average));
    repaint();
    }

    } //for loop
} //DrawBar

private void DrawAverageLine() 
{   
    int average = averageLine(data);
    g.drawLine(0, average, 800, average);
}


public static int getMaxValue(int[] data) {  
    int maxValue = data[0];  
    for (int i=1;i < data.length;i++) {  
        if (data[i] > maxValue)  
            maxValue = data[i];  
    }  
    return maxValue;  
   }

public static int getMinValue(int[] data) {
    int minValue = data[0];
    for (int i = 1; i < data.length; i++) {
        if (data[i] < minValue) 
           minValue = data[i];
    }
    return minValue;
}

public static double arrayAverage(int[] data) {
    double result = 0.0;
    for (int i = 0; i < data.length; i++) {
        result = result + data[i];
    }
    result = result/data.length;
    return result;
    }

    public static int averageLine (int[] data) {
    int max = getMaxValue(data);
    int min = getMinValue(data);
    return (HEIGHT * max - (int)arrayAverage(data)) / (max - min);
    }

    public void paint( Graphics g)
    {   if (fImageBuffer != null )
        g.drawImage(fImageBuffer, fInsets.left, fInsets.top, null);

    }

    public void ReadInputData() throws FileNotFoundException {
        try {Scanner readFile = new Scanner(new File("BarChart.data"));
            data = new int [13];
            for (int i = 0; i < data.length; i++)
                data[i] = readFile.nextInt();

        } //try

        catch (FileNotFoundException e) {
            System.out.println(e);
        }

    } // ReadInputData

public static void main(String[] args) throws FileNotFoundException {

    new BasicGraphicsTester();
}


}

助けてください。前もって感謝します。

4

4 に答える 4

2

AJFrameは空のフレームです。データを画面にレンダリングするにはJPanel、フレーム内に a を配置し、後者のメソッドをオーバーライドする必要があります。paintComponent()

于 2012-11-02T16:43:33.243 に答える
2

これは、Swing でグラフィックスや描画を行う方法ではありません。あなたが読んだどのチュートリアルで、Graphics オブジェクトを取得するように推奨されているかを知りたいと思います。代わりに、JVM によってパラメーターとして提供される Graphics インスタンスを使用して、JPanel などの JComponent を拡張するクラスのメソッドを描画し、paintComponent(...)このコンポーネントを JFrame に追加する必要があります。標準の Swing チュートリアルの一部であるSwing チュートリアルの絵を読みたいと思うでしょう。

于 2012-11-02T16:44:08.220 に答える
0

私は最近、BarGraph コンポーネントを使用して JavaFX で同様のものを書きました。ソースコードが役立つ場合は投稿しますが、swing を使用する必要があり、プロジェクトのポイントは独自の棒グラフを作成することです。私のjavafx棒グラフを見る

于 2012-11-02T17:21:48.877 に答える
0

JFrame に直接描画したい場合でも、JFrame のペイント メソッド AFAIK ではなく、ContentPane のペイントをオーバーライドする必要があります。はい、より良い方法は、(JPanel を拡張するなどして) 独自のコンポーネントを実装し、それを JFrame 内に配置することです (ContentPane に配置する必要があることに注意してください)。

ContentPane については、JFrame の javadoc を確認してください。

于 2012-11-02T17:00:16.260 に答える