ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-31 18:01:48  阅读:184  来源: 互联网

标签:paintcomponent graphics swing jframe java


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

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

编译正确,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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有