Frage

Ich suche die grundlegendste Beschreibung, wie Text innerhalb eines JPanel zu ziehen. Ich weiß, es gibt eine Milliarde Tutorials gibt aber keine von ihnen mit mir zu klicken, und ich habe einige spezifische Fragen, die anderen helfen können, die verwirrt sind. Als Einrichtung (ein Test App) Ich habe eine einzige Klasse, die eine JLabel hat, eine JTextField, einen JButton und ein JPanel. Die Anwendung liest in Ints aus einer externen Datei und soll ihren Durchschnitt im Panel angezeigt werden, wenn der JButton gedrückt wird. Ich habe alle die darunter liegende programing aussortiert (das heißt, die Taste reagiert und druckt den Durchschnitt der Befehlszeile), aber ich kann einfach nicht zu klären, scheinen wie die durchschnittliche auf die Platte zu drucken. Ich denke, meine größte Frage ist, wie die Farbe () oder paintComponet () -Methode in zusammen mit dem Rest des Codes zu integrieren. Sollte es sein, es ist eine eigene Klasse? Sollten die JPanel seine eigene Klasse sein? Es scheint, wie das ist, was die meisten der Tutorials sagen mir, ich bin nur nicht sicher, was der erste Schritt genau ist. Der Code sieht so 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);
}
}

Jede und alle Hilfe / Richtung wird geschätzt. Ich weiß, dass ich diesen Code für andere Fragen vor kurzem verwendet haben, ich möchte nur wissen, sie alle! Im Idealfall würde das Panel an den Durchschnitt der Lese in Ints angezeigt, wenn die Schaltfläche geklickt wurde, und die Anzeige, was in die textfeild eingegeben wurde, als der Fokus auf es und geben Sie wurde gedrückt, aber ich nehme Baby-Schritte, und wie ich schon sagte, ich mag mich für dieses Thema eine allgemeine Anleitung für andere mit ähnlichen Fragen zu sein, die nicht Antworten von Sonne docs oder anderen Websites zu finden. Vielen Dank im Voraus. Dan :)

War es hilfreich?

Lösung

Eine innere Klasse, die JPanel in Ihrem Haupt Klasse erweitert:

class MyPanel extends JPanel {

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

}

Dann müssen Sie auf dieser Platte neu streichen rufen nach computeAverage () in actionPerformed Aufruf:

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

Andere Tipps

Fügen Sie eine JLabel auf die JPanel.

Rufen setText (String) auf der JLabel und Ihr Text wird innerhalb des JPanel gezogen werden.

1) Ein JFrame keinen paintcomponent () -Methode so der Code, den Sie geschrieben wird nichts tun. Sie müssen eine benutzerdefinierte JPanel erstellen und seine paintcomponent () -Methode außer Kraft setzen Ihre benutzerdefinierte Malerei zu tun.

2) Selbst wenn Sie die oben tun, wird das Bild noch nicht angezeigt werden, da ein Panel standardmäßig eine Größe Null hat. So werden Sie dann die bevorzugte Größe der Platte festlegen müssen, um sicherzustellen, dass es sichtbar ist.

3) Warum sind Sie selbst dies zu tun. Alles was Sie tun müssen, ist ein JLabel verwenden und den Text des JLabel eingestellt.

Ich finde es schwer zu glauben, dass Sie bei anderen Tutorials aussehen. Die Swing-Tutorial auf Benutzerdefinierte Gemälde 20 Linie Programm, das die Grundlagen zeigt.

Ich glaube, Sie sollten nicht JFrame werden Subklassen. Machen Sie eine Instanz von JFrame eine Instanz
Variable der Hauptklasse und fügen Sie die JPanel usw. zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top