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 :)
Merci pour le travail que vous avez mis dans votre réponse. Accepté pour cela par lui-même ... – danwoods
-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
vous avez raison, j'ai corrigé la solution –