Pregunta

Busco 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 es hacer 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, JTextField, un JButton, y un JPanel. La aplicación lee en enteros desde un archivo externo y debe mostrar su promedio en el panel cuando se pulsa el JButton. Tengo toda la programación subyacente resuelto (es decir, el botón responde e imprime el promedio de la línea de comandos) pero simplemente parece que no puede resolver cómo imprimir el promedio para el panel. Creo que mi mayor pregunta es cómo incorporar el método paintComponet paint () () o en junto con el resto del código. ¿Debería ser su propia clase? Deben ser los JPanel su propia clase? Parece que eso es lo que la mayoría de los tutoriales me están diciendo, pero no estoy seguro de lo que el primer paso es exactamente. El código es el siguiente:

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);
}
}

Cualquier y toda la ayuda / dirección es apreciado. Sé que he utilizado este código recientemente para otras preguntas, sólo quiero saber todo! Lo ideal sería que el panel podría mostrar el promedio de la lectura en enteros cuando se hace clic en el botón y se presiona la pantalla todo lo que se introduce en el textfeild cuando la atención se centró en él y entrar, pero yo estoy tomando pasos de bebé, y como he dicho, me gustaría que este hilo para ser un tutorial general para otros con preguntas similares que no están encontrando respuestas a partir de documentos de sol u otros sitios. Muchas gracias de antemano. Dan :)

¿Fue útil?

Solución

Crea una clase interna que se extiende JPanel dentro de su clase principal:

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(Integer.toString(avg), 75, 75);
    }

}

Luego hay que llamar a volver a pintar en ese panel después de llamar computeAverage () en actionPerformed:

//event handling
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == avgBtn) {
        computeAverage();
        panel.repaint();
    }
}

Otros consejos

Añadir un JLabel al JPanel.

Llamada setText (String) en el JLabel y su texto se dibujará en el JPanel.

1) Un JFrame no tiene un método paintComponent () por lo que el código que envió no hará nada. Es necesario crear un JPanel personalizados y anular su método paintComponent () para hacer su pintura personalizada.

2) Incluso si lo hace lo anterior, la pintura todavía no se muestren debido a un panel por defecto tiene un tamaño cero. Así que a continuación, tendrá que establecer el tamaño preferido del panel para asegurarse de que es visible.

3) ¿Por qué está haciendo esto aun. Todo lo que necesita hacer es utilizar un JLabel y establecer el texto de la JLabel.

Me resulta difícil creer que parecía en otros tutoriales. El tutorial Swing en Custom Painting tiene una línea 20 programa que muestra los conceptos básicos.

Creo que no se debe de subclases JFrame. Hacer una instancia de una instancia JFrame
variables de la clase principal y añadir los JPanel etc a ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top