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在框架内放置一个,并覆盖后者的paintComponent()方法以便在屏幕上呈现您的数据。

于 2012-11-02T16:43:33.243 回答
2

这不是您使用 Swing 进行图形或绘图的方式,我很想看看您阅读过的教程建议您在执行操作时获取 Graphics 对象。相反,您应该paintComponent(...)使用 JVM 作为参数提供的 Graphics 实例来绘制扩展 JComponent 的类的方法,例如 JPanel,然后将此组件添加到您的 JFrame。您将需要阅读作为标准 Swing 教程一部分的Swing 教程中的绘画。

于 2012-11-02T16:44:08.220 回答
0

如果您想直接绘制到 JFrame 中,您仍然必须覆盖 ContentPane 的绘制,而不是 JFrame 的绘制方法 AFAIK。是的,更好的方法是实现您自己的组件(例如通过扩展 JPanel)并将其放置在 JFrame 中(记住它必须放置在 ContentPane 中)。

检查 JFrame javadocs 关于 ContentPane。

于 2012-11-02T17:00:16.260 回答
0

我最近使用 BarGraph 组件在 JavaFX 中写了一些类似的东西。如果有帮助,我会发布源代码,但也许您需要使用 swing,您的项目的重点是制作自己的条形图。查看我的javafx 条形图

于 2012-11-02T17:21:48.877 回答