Estoy buscando la descripción más básica de cómo dibujar texto dentro de un JPanel. Sé que hay mil millones de tutoriales por ahí, pero ninguno de ellos está haciendo clic conmigo y tengo algunas preguntas específicas que pueden ayudar a otros que están confundidos. Como configuración (una aplicación de prueba) tengo una sola clase que tiene un JLabel, un JTextField, un JButton y un JPanel. La aplicación lee entradas de un archivo externo y debe mostrar su promedio en el panel cuando se presiona JButton. Tengo toda la programación subyacente resuelta (es decir, el botón responde e imprime el promedio en la línea de comandos), pero parece que no puedo resolver cómo imprimir el promedio en el panel. Supongo que mi mayor pregunta es cómo incorporar el método paint() o paintComponet() junto con el resto del código. ¿Debería ser su propia clase? ¿El JPanel debería ser su propia clase? Parece que eso es lo que la mayoría de los tutoriales me dicen, no estoy seguro de cuál es exactamente el primer paso. El código se ve así:dibujo de texto dentro de un JPanel
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Main extends JFrame implements ActionListener {
private int[] intArray = new int[10000];
private int numOfInts = 0;
private int avg = 0;
protected JButton avgBtn;
protected JTextField indexEntry;
protected JLabel instructions;
protected JPanel resultsPanel;
public Main(){
//create main frame
this.setTitle("Section V, question 2");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(350, 250);
this.setLayout(new GridLayout(4, 1));
//create instruction label and add to frame
instructions = new JLabel("Follow the instructions on the exam to use this program");
this.add(instructions);
//create textfield for index entry and add to frame
indexEntry = new JTextField();
this.add(indexEntry);
//create button for average and add to frame
avgBtn = new JButton("Click for Average");
this.add(avgBtn);
avgBtn.addActionListener(this);
//create panel to display results and add to frame
resultsPanel = new JPanel();
resultsPanel.setBackground(Color.BLUE);
this.add(resultsPanel);
//read in from file
readFromFile();
//compute average
computeAverage();
}
private void readFromFile() {
try {
// Open the file
FileInputStream fstream = new FileInputStream("numbers.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
//create placeholder for read in ints
String strLine;
//Read File Line By Line
int i = 0;
while ((strLine = br.readLine()) != null) {
//place ints in array and increament the count of ints
System.out.println (strLine);
intArray[i] = Integer.parseInt(strLine);
numOfInts++;
i++;
}
//Close the input stream
in.close();
System.out.println ("numOfInts = " + numOfInts);
}
catch (Exception e) {
//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
//compute averaage
private void computeAverage() {
int sum = 0;
for (int i = 0; i < numOfInts; i++)
sum += intArray[i];
avg = sum/numOfInts;
System.out.println("avg = " + avg);
}
//event handling
public void actionPerformed(ActionEvent e) {
if(e.getSource() == avgBtn) {
computeAverage();
}
}
//"main" function
public static void main(String[] args) {
Main m = new Main();
m.setVisible(true);
}
//paint
public void paintComponent(Graphics g){
g.drawString(avg, 75, 75);
}
}
Se agradece cualquier ayuda/dirección. Sé que he usado este código recientemente para otras preguntas, ¡solo quiero saberlo todo! Lo ideal sería que el panel muestre el promedio de las entradas de lectura cuando se hizo clic en el botón y que se muestre lo que se ingresó en el campo de texto cuando se enfocó y se presionó ingresar, pero estoy dando pequeños pasos, y como dije, Me gustaría que este hilo sea un tutorial general para otras personas con preguntas similares que no encuentran respuestas de doctores u otros sitios. Muchas gracias de antemano. Dan :)
Gracias por el trabajo que pones en tu respuesta. Aceptado por sí solo ... – danwoods
-1 la sugerencia de cambiar el método paintComponent() para pintar() es incorrecta. Anular pintura() en el nivel de marco es una de las peores cosas que puedes hacer cuando no invocas super.paint(). Por un lado, ninguno de los componentes agregados al marco será pintado, ya que esto es manejado por la súper clase. También perderá optimizaciones de pintura. – camickr
tienes razón, arreglé la solución –