Domanda

Sto cercando la descrizione più semplice di come disegnare testo all'interno di un JPanel. So che ci sono un miliardo di tutorial là fuori, ma nessuno di loro stanno facendo clic con me e ho alcune domande specifiche che possono aiutare gli altri che sono confusi. Come un setup (un'applicazione di test) Ho una sola classe che ha una JLabel, un JTextField, un JButton e un JPanel. L'applicazione legge in interi da un file esterno e dovrebbe mostrare la loro media nel pannello quando si preme il JButton. Ho tutto il sottostante di programmazione risolto (cioè il tasto risponde e stampa la media alla riga di comando), ma io proprio non riesco a risolvere come stampare la media al pannello. Credo che la mia più grande domanda è come incorporare la vernice () o il metodo paintComponet () in lungo con il resto del codice. Dovrebbe essere il proprio classe? Qualora le JPanel sia essa la propria classe? Sembra che questo è ciò che la maggior parte dei tutorial mi stanno dicendo, solo che non sono sicuro di quello che il primo passo è esattamente. Il codice appare come:

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

Qualsiasi aiuto / direzione è apprezzato. So che ho usato questo codice recentemente per altre domande, voglio solo sapere tutto! Idealmente il pannello visualizzerà la media della lettura in int quando il pulsante è stato cliccato, e è stato premuto visualizzazione ciò che è stato inserito nel textfeild quando l'attenzione si è concentrata su di essa ed entrare, ma sto prendendo piccoli passi, e come ho detto, Vorrei che questa discussione sia un tutorial generale per gli altri con domande simili che non stanno trovando risposte da docs solari o altri siti. Grazie mille in anticipo. Dan :)

È stato utile?

Soluzione

Creare una classe interna che si estende JPanel dentro la classe principale:

class MyPanel extends JPanel {

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

}

Quindi è necessario chiamare ridipingere su quel pannello dopo aver chiamato computeAverage () in actionPerformed:

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

Altri suggerimenti

Aggiungi un JLabel al JPanel.

Chiama setText (String) sulla JLabel e il testo sarà disegnato all'interno del JPanel.

1) Un JFrame non ha un metodo paintComponent () in modo che il codice che hai postato non farà nulla. È necessario creare un JPanel personalizzati e sovrascrivere il metodo paintComponent () per fare la tua verniciatura personalizzata.

2) Anche se si fa quanto sopra, il dipinto sarà ancora non visualizza perché un pannello di default ha una dimensione pari a zero. Così sarà quindi necessario impostare la dimensione preferita del pannello per assicurarsi che sia visibile.

3) Perché stai ancora facendo questo. Tutto quello che dovete fare è usare un JLabel e impostare il testo del JLabel.

Trovo difficile credere che hai guardato altri tutorial. Il tutorial Swing on Custom Painting ha una linea 20 programma che mostra i principi fondamentali.

Credo che non dovrebbe essere sottoclasse JFrame. Fare un esempio di JFrame un'istanza
variabile della classe principale e aggiungere i JPanel ecc ad esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top