2009-12-02 7 views
5

Je cherche la description la plus basique de la façon de dessiner du texte dans un JPanel. Je sais qu'il y a un milliard de tutoriels, mais aucun d'eux ne clique avec moi et j'ai quelques questions spécifiques qui peuvent aider les autres qui sont confus. En tant qu'installation (une application de test), j'ai une seule classe qui a un JLabel, un JTextField, un JButton et un JPanel. L'application lit ints à partir d'un fichier externe et devrait afficher leur moyenne dans le panneau lorsque le bouton JButton est enfoncé. J'ai toute la programmation sous-jacente triée (c'est-à-dire, le bouton répond et imprime la moyenne à la ligne de commande) mais je ne peux pas sembler juste trier comment imprimer la moyenne au panneau. Je suppose que ma plus grande question est de savoir comment incorporer la méthode paint() ou paintComponet() avec le reste du code. Est-ce que ce devrait être son propre cours? Le JPanel devrait-il être sa propre classe? Il semble que c'est ce que me disent la plupart des tutoriels, je ne suis pas sûr de la première étape. Le code ressemble à:texte de dessin dans 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); 
} 
} 

Toute aide et direction est appréciée. Je sais que j'ai utilisé ce code récemment pour d'autres questions, je veux juste tout savoir! Idéalement, le panneau afficherait la moyenne des valeurs lues en cliquant sur le bouton et afficherait tout ce qui était entré dans le texte lorsque l'accent était mis dessus et que l'entrée était pressée, mais je fais des pas de bébé, et comme je l'ai dit, Je voudrais que ce fil de discussion soit un tutoriel général pour d'autres personnes ayant des questions similaires et qui ne trouvent pas de réponses de Sun Docs ou d'autres sites. Merci beaucoup d'avance. Dan :)

Répondre

6

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(); 
    } 
} 
+0

Merci pour le travail que vous avez mis dans votre réponse. Accepté pour cela par lui-même ... – danwoods

+1

-1 la suggestion de changer la méthode paintComponent() en paint() est fausse. Remplacer paint() au niveau de la frame est l'une des pires choses que vous pouvez faire quand vous n'appelez pas super.paint(). D'une part, aucun des composants ajoutés à l'image ne sera peint puisque ceci est géré par la super classe. Vous perdrez également les optimisations de peinture. – camickr

+0

vous avez raison, j'ai corrigé la solution –

7

Ajoutez un JLabel au JPanel.

Appelez setText (String) sur le JLabel et votre texte sera dessiné dans le JPanel.

+0

J'aime la simplicité de ceci. Pas exactement ce que je cherchais. mais merci d'avoir regardé ma question. – danwoods

2

1) A JFrame n'a pas de méthode paintComponent() donc le code que vous avez posté ne fera rien. Vous devez créer un JPanel personnalisé et remplacer sa méthode paintComponent() pour faire votre peinture personnalisée.

2) Même si vous faites ce qui précède, la peinture ne s'affichera toujours pas car un panneau par défaut a une taille nulle. Vous devrez donc définir la taille préférée du panneau pour vous assurer qu'il est visible.

3) Pourquoi faites-vous cela? Tout ce que vous devez faire est d'utiliser un JLabel et de définir le texte du JLabel. Je trouve difficile de croire que vous avez regardé d'autres tutoriels. Le tutoriel Swing sur Custom Painting a un programme de 20 lignes qui montre les bases.

+0

Wow, un peu abrasif hein? Peut vouloir changer votre nom d'écran en camdickr. Merci pour le lien. – danwoods

+1

Sauf que j'ai fourni la bonne réponse. Celui que vous avez accepté a été édité après que le mien a été posté. J'ai aussi suggéré le JLabel avant l'autre poster. J'ai fourni des explications pourquoi le code n'a pas fonctionné et ai donné des suggestions pour le réparer. "Donnez à quelqu'un un poisson qu'il mange pendant une journée, apprenez à pêcher, puis mangez pour la vie, je vous ai donné des outils et des conseils pour apprendre à développer vos propres compétences, ce qui sera mieux à long terme. Attendre que les gens à écrire du code pour vous est la mauvaise attitude – camickr

-1

Je pense que vous ne devriez pas sous-classer JFrame. Faire une instance de JFrame une instance
variable de la classe Main et y ajouter le JPanel etc.

+0

cela ne tente même pas de répondre à la question, serait mieux comme un commentaire sur la question – pstanton

+0

D'accord.Voulu ajouter rapidement quelque chose que je pensais aider Mais en regardant en arrière, je suis d'accord mon poste ne fournit pas beaucoup d'aide – sateesh

+0

juste poster un commentaire, toujours utile, mais ne pose pas comme une réponse. – pstanton