zeichnen von text in ein JPanel
Ich bin auf der Suche nach der grundlegenden Beschreibung, wie man zum zeichnen von text in ein JPanel. Ich weiß, es gibt eine Milliarde tutorials gibt, aber keiner von Ihnen hat Klick bei mir und ich habe einige spezielle Fragen, die kann helfen, andere Menschen, die verwirrt sind. Als ein setup (eine Test-app) ich habe eine einzige Klasse, die hat ein JLabel, JTextField, ein JButton und ein JPanel. Die Anwendung liest in int-Werte aus einer externen Datei und sollte anzeigen, deren Durchschnitt in der Systemsteuerung, wenn der JButton gedrückt wird. Ich habe alle der zugrunde liegenden Programmierung aussortiert (das ist die Taste reagiert und druckt den Mittelwert für die Kommandozeile), aber ich kann einfach nicht scheinen, heraus zu Sortieren, wie zum drucken der Durchschnitt auf der Platte. Ich denke, meine größte Frage ist, wie integrieren Sie die paint() oder paintComponet () - Methode, zusammen mit dem rest des Codes. Sollte es sein das es eine eigene Klasse? Sollte das JPanel werden, es ist eine eigene Klasse? Es scheint, wie das ist, was die meisten tutorials sagen mir, ich bin nur nicht sicher, was der erste Schritt ist, genau. Der code sieht wie folgt aus:
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);
}
}
Jegliche Hilfe/Richtung, wird sehr geschätzt. Ich weiß, ich habe diesen code vor kurzem für die anderen Fragen, ich will nur alles wissen! Im Idealfall wird das panel zeigt die durchschnittlichen Lesen Sie in int-Werte, wenn auf die Schaltfläche geklickt wurde, und wird alles angezeigt, was eingetragen wurde in die textfeild, wenn der Fokus wurde auf und geben Sie gedrückt wurde, aber ich bin die baby-Schritte, und wie ich schon sagte, möchte ich für diesen thread zu einem Allgemeinen tutorial für andere mit ähnlichen Fragen, nicht die Antworten von sun docs oder anderen Websites. Vielen Dank im Voraus. Dan 🙂
InformationsquelleAutor danwoods | 2009-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie eine innere Klasse, die Sie erweitert JPanel innerhalb deiner Main-Klasse:
Dann müssen Sie rufen repaint auf, das panel nach dem Aufruf computeAverage() in der actionPerformed:
-1 der Vorschlag zur änderung der paintComponent () - Methode paint() ist falsch. Überschreiben von paint() auf den frame-Ebene ist eines der schlimmsten Dinge, die Sie tun können, wenn Sie nicht aufrufen super.paint(). Für eine Sache, die keine der Komponenten Hinzugefügt wird der Rahmen lackiert werden, da dies erledigt der super-Klasse. Sie verlieren auch Malerei Optimierungen.
du hast Recht, habe ich Fix die Lösung
InformationsquelleAutor David Robles
Fügen Sie ein JLabel auf dem JPanel.
Rufen Sie setText(String) auf dem JLabel und der text gezeichnet werden, die innerhalb des JPanel.
InformationsquelleAutor Gunslinger47
1) Einem JFrame nicht über eine paintComponent () - Methode so, dass der code, den Sie geschrieben wird nicht alles tun. Müssen Sie erstellen eine benutzerdefinierte JPanel und überschreiben Sie die paintComponent () - Methode, um Ihre custom-painting.
2) Auch wenn Sie die oben genannten, die Malerei wird immer noch nicht angezeigt, weil ein panel standardmäßig hat eine Größe null. So werden Sie dann brauchen, um die bevorzugte Größe des Panels, um sicherzustellen, dass es sichtbar ist.
3) Warum sind Sie auch, dies zu tun. Alles, was Sie tun müssen, ist ein JLabel und setzt den text des JLabel.
Ich finde es schwer zu glauben, Sie schaute auf die anderen tutorials. Das Swing-tutorial auf Custom Painting hat ein 20-Zeilen-Programm, das zeigt die Grundlagen.
Außer, dass ich die richtige Antwort. Die, die Sie akzeptiert wurde bearbeitet nach mir gepostet wurde. Ich habe auch vorgeschlagen, das JLabel, bevor die anderen poster. I sofern Erklärungen, warum der code nicht funktioniert hat und gab Vorschläge, es zu beheben. "Gib jemandem einen Fisch, den Sie Essen für einen Tag. Lehren Sie jemanden zu Fischen, dann Essen Sie für das Leben. Ich gab Ihnen Werkzeuge und Ratschläge, um zu erfahren, wie entwickeln Sie Ihre eigenen Fähigkeiten die wird besser sein im langen Lauf. Das ist, warum ich keine post-code. Erwarten die Menschen, um code zu schreiben, für Sie ist die falsche Einstellung.
InformationsquelleAutor camickr
Ich denke, Sie sollten nicht Unterklassen von JFrame. Stellen Sie eine Instanz von JFrame eine Instanz
variable der Main-Klasse und hinzufügen von JPanel etc. .
Vereinbart.Hinzufügen wollte schnell etwas, was ich dachte, dass würde helfen. Aber rückblickend Stimme ich meinen Beitrag nicht viel helfen.
einfach einen Kommentar posten, immer noch hilfsbereit, aber nicht darstellen, wie eine Antwort.
InformationsquelleAutor sateesh