ejemplo - como llamar al metodo paintcomponent en java
Extender un JFrame(error de ventana vacĂa) (4)
Estoy haciendo un proyecto que hace lo siguiente en pocas palabras:
- lee enteros de un archivo
- los almacena en una matriz
- crea una gráfica de barras de los números con una línea promedio
- los números por encima del promedio suben, los números a continuación disminuyen (ambos también son colores diferentes)
Se compila correctamente, aparece la ventana JFrame, pero no se imprimen datos. Es solo una ventana vacía.
Aquí está mi código:
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();
}
}
Por favor ayuda. Gracias por adelantado.
Esta no es la forma de hacer gráficos o dibujar con Swing, y me gustaría ver qué tutorial leyó le recomienda obtener el objeto Graphics mientras lo hace. En su lugar, debe dibujar el paintComponent(...)
de una clase que amplíe JComponent como JPanel, utilizando la instancia de Graphics proporcionada como parámetro por la JVM, y luego agregue este componente a su JFrame. Querrá leer la pintura en el tutorial de Swing, que forma parte de los tutoriales estándar de Swing.
Recientemente escribí algo similar en JavaFX usando el componente BarGraph. Publicaré el código fuente si fuera útil, pero tal vez necesites usar swing y el objetivo de tu proyecto es hacer tu propio gráfico de barras. Ver mi gráfico de barras javafx
Si desea ingresar directamente al JFrame, debe sobrescribir la pintura de ContentPane, no el método de pintura AFFK de JFrame. Y sí, una mejor manera sería implementar su propio componente (por ejemplo, extendiendo JPanel) y colocarlo dentro del JFrame (recuerde que debe colocarse en el Panel de Contenido).
Compruebe JFrame javadocs sobre ContentPane.
Un JFrame
es un marco vacío. JPanel
colocar un JPanel
dentro de su marco y anular el método paintComponent()
este último para representar sus datos en la pantalla.