编程语言
首页 > 编程语言> > java-扩展JFrame(空窗口错误)

java-扩展JFrame(空窗口错误)

作者:互联网

我正在做一个概述如下的项目:

>从文件中读取整数
>将它们存储在数组中
>用平均线创建数字条形图
>高于平均值的数字上升,低于平均值的数字下降(两者也是不同的颜色)

编译正确,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();
}


}

请帮忙.提前致谢.

解决方法:

JFrame是一个空框架.您需要在框架内放置一个JPanel,并重写后者的paintComponent()方法,以便在屏幕上呈现数据.

标签:paintcomponent,graphics,swing,jframe,java
来源: https://codeday.me/bug/20191031/1977700.html