扩展JFrame类(空窗口错误)

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个回答

2

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


2
这不是在使用Swing绘制图形的正确方法,我很想知道你所看到的教程是怎么推荐你像这样获取Graphics对象的。相反,你应该在继承JComponent类(如JPanel)的类的paintComponent(...)方法中绘制,使用JVM提供的传入参数的Graphics实例,并将此组件添加到你的JFrame中。建议阅读标准Swing教程中的Swing中的绘画教程。请注意,保留HTML标签。

0
如果您想直接在JFrame中绘制,仍然需要覆盖ContentPane的paint方法,而不是JFrame的paint方法。另外,更好的方法是实现自己的组件(例如通过扩展JPanel),并将其放置在JFrame中(请记住它必须放置在ContentPane中)。
请查看JFrame javadocs有关ContentPane的信息。

并不存在名为“ContentPane”的东西。是的,顶层窗口包含被称为其contentPane的容器,但没有Java类以此命名。你可能指的是其他答案已经提到的JComponents或JPanels。 - Hovercraft Full Of Eels
它是一个容器。但它不仅仅是任何容器。请检查JFrame.getContentPane()方法。 我不明白你为什么这么挑剔 - 我从未说过有一个叫做ContentPane的类。我只提到了一个叫做“ContentPane”的“东西” - 是的,虽然在类方面它是Container的一个特殊实例。 - mvmn
编译器很挑剔。如果我读了你的答案并尝试创建一个 new ContentPane(),我知道编译器会告诉我什么。 - Hovercraft Full Of Eels
@HovercraftFullOfEels 他指的是JRootPane - Mordechai

0

我最近使用BarGraph组件在JavaFX中编写了类似的东西。如果有帮助的话,我可以发布源代码,但也许你需要使用swing并且你的项目的重点是制作自己的条形图。

查看我的javafx条形图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接