Question

Je cherche la description la plus fondamentale de la façon de dessiner le texte dans un JPanel. Je sais qu'il ya un milliard de tutoriels là-bas, mais aucun d'entre eux sont en cliquant avec moi et j'ai quelques questions spécifiques qui peuvent aider les autres qui sont confus. En configuration (une application de test) J'ai une seule classe qui a un JLabel, un JTextField, un JButton et un JPanel. L'application se lit dans ints d'un fichier externe et devrait afficher leur moyenne dans le panneau lorsque la JButton est pressée. J'ai tout le sous-jacent réglé la programmation (qui est, le bouton répond et affiche la moyenne de la ligne de commande) mais je ne peux pas sembler pour trier comment imprimer la moyenne du panneau. Je pense que ma plus grande question est de savoir comment incorporer la méthode de peinture () ou paintComponet () en même temps que le reste du code. Faut-il que ce soit sa propre classe? Si les JPanel que ce soit sa propre classe? Il semble que c'est ce que la plupart des tutoriels me disent, je ne suis pas sûr de ce que la première étape est exactement. Le code ressemble à:

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

Toute aide / direction est appréciée. Je sais que je l'ai utilisé ce code récemment pour d'autres questions, je veux juste savoir tout! Idéalement, le panneau afficherait la moyenne de la lecture en ints lorsque le bouton a été cliqué, et l'affichage tout ce qui était entré dans le textfeild lorsque l'accent était mis sur et entrer a été pressé, mais je prends des mesures pour bébés, et comme je l'ai dit, Je voudrais que ce fil à un cours d'instruction générale pour d'autres avec des questions similaires qui ne sont pas de trouver des réponses de docs du soleil ou d'autres sites. Merci beaucoup d'avance. Dan :)

Était-ce utile?

La solution

Créer une classe interne qui s'étend JPanel dans votre classe principale:

class MyPanel extends JPanel {

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

}

Ensuite, vous devez appeler repeindre sur ce panneau après avoir appelé computeAverage () dans actionPerformed:

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

Autres conseils

Ajouter un JLabel à JPanel.

Appel setText (String) sur le JLabel et votre texte sera tiré au sort dans le JPanel.

1) JFrame ne dispose pas d'une méthode paintComponent () de sorte que le code affiché ne fera rien. Vous devez créer un JPanel personnalisés et remplacer la méthode paintComponent () pour faire votre peinture sur mesure.

2) Même si vous faites ce qui précède, le tableau ne parvient toujours pas afficher car un panneau par défaut a une taille zéro. Donc, vous devrez alors définir la taille préférée du panneau pour vous assurer qu'il est visible.

3) Pourquoi faites-vous même cela. Tout ce que vous devez faire est d'utiliser un JLabel et définissez le texte de la JLabel.

Je trouve difficile à croire que vous regardé d'autres tutoriels. Le tutoriel Swing sur Peinture personnalisée a une ligne 20 programme qui montre les bases.

Je pense que vous ne devriez pas être sous-classement JFrame. Faire une instance de JFrame une instance
variable de classe principale et ajoutez les JPanel etc. à elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top