2016-05-31 12 views
0

Dies könnte eine sehr offensichtliche Frage für einige sein, aber ich kann es nicht herausfinden. Ich bin neu bei Eclipse und habe nur mit Dr.Java programmiert. Ich erstelle ein mad libs Programm, wo der Benutzer Substantive, Adjektive, Namen und Zahlen eingeben muss und am Ende wird es in einer Geschichte angezeigt.Wie drucke ich etwas Text auf dem Java jPanel?

Nachdem der Benutzer alle erforderlichen Informationen eingegeben hat, möchte ich die fertige Geschichte in einem jPanel öffnen. Ich kann nicht herausfinden, wie der Text der JPanel hinzuzufügen (I der Text mit der c beginnen möchten Code in einem Fenster angezeigt werden, nachdem der Benutzer alle Informationen eingegeben hat.) Hier ist der Code:.

import java.util.Scanner; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MadLibs{ 

public static void Action1() 
    { 

    JFrame frame = new JFrame("Mad Libs"); 
    // Add a window listener for close button 
    frame.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
    System.exit(0); 
     } 
    }); 

    Scanner input = new Scanner(System.in); 

    System.out.println("Male Friend:"); 
    String maleFriend = input.nextLine(); 
    System.out.println("Adjective:"); 
    String adjective1 = input.nextLine(); 
    System.out.println("Past Tense Verb:"); 
    String pastTenseVerb1 = input.nextLine(); 
    System.out.println("Past Tense Verb 2:"); 
    String pastTenseVerb2 = input.nextLine(); 
    System.out.println("Large Number:"); 
    String largeNumber = input.nextLine(); 
    System.out.println("Famous Female:"); 
    String famousFemale = input.nextLine(); 
    System.out.println("Adverb:"); 
    String adverb = input.nextLine(); 
    System.out.println("Place:"); 
    String place = input.nextLine(); 
    System.out.println("Body Part(singular):"); 
    String bodyPart = input.nextLine(); 
    System.out.println("Large Number:"); 
    String largeNumber2 = input.nextLine(); 
    System.out.println("Verb ending with -ing"); 
    String ingEnding1 = input.nextLine(); 
    System.out.println("Singular noun:"); 
    String singularNoun = input.nextLine(); 
    System.out.println("Plural Noun:"); 
    String pluralNoun = input.nextLine(); 



    // This is an empty content area in the frame 
    JLabel jlbempty = new JLabel(""); 
    jlbempty.setPreferredSize(new Dimension(600, 800)); 
    frame.getContentPane().add(jlbempty, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible(true); 

    //The story I want displayed on the jPanel: 
    /* 
    c.println("The Great Dough Disaster"); 
     c.println("\nLast summer, my friend "+ maleFriend + " got a job at the " + adjective1 +" Pastry Shop. For the first few"); 
     c.println("weeks, he " + pastTenseVerb1 + " the floors, " + pastTenseVerb2 + " on the shelves, and unloaded " + largeNumber + " pound sacks"); 
     c.println("of flour from the delivery trucks.\n"); 
     c.println("Finally, "+famousFemale+", the owner, told "+maleFriend+" that she would teach him to make bread. Now,"); 
     c.println("pay attention, "+maleFriend+",” she said every day. “I'll make the first batch of dough. Then you"); 
     c.println("can make the next batch while I go to "+place+".\n"); 
     c.println("Poor "+maleFriend+"! He had a habit of letting his "+bodyPart+" wander. When " +famousFemale+ " left for "+place); 
     c.println("he started to mix the ingredients. “Let me see,” he said. “I think she put in "+largeNumber2); 
     c.println("packages of yeast.”\n"); 
     c.println("A short while later, the dough started "+ingEnding1+". It kept on "+ingEnding1+". "+maleFriend+" tried to"); 
     c.println("cover it with a(n) "+singularNoun+", but the dough wouldn't stop "+ingEnding1+". It was everywhere! "); 
     c.println("“What can I do?” thought "+maleFriend+".\n"); 
     c.println("Just then, Tyana returned from toronto. “"+maleFriend+"” she screamed. “What have you done?”"); 
     c.println("“It's not my fault,” cried "+maleFriend+". “The dough just started "+ingEnding1+" and wouldn't stop.”"); 
     c.println(famousFemale + " had to let him go. Now "+maleFriend+" has a job making "+singularNoun+". I don't think he'll ever"); 
     c.print("eat bread again, let alone make it."); 
     */ 


    } 

public static void main(String []args){ 
    Action1(); 
} 

} 

Außerdem bin ich etwas verwirrt darüber, wie das jPanel funktioniert. Ich habe viele Möglichkeiten gefunden, Dinge auf dem jPanel anzuzeigen, und ich weiß nicht, welchen ich verwenden soll.

+0

Verwenden Sie JLabels für Text auf JPanels. – Compass

+0

Es gibt keine 'jpanel's hier, nur Etiketten .... – Antoniossss

Antwort

3

Ich denke sofort an zwei Möglichkeiten, dies zu tun.

Die erste ist viel einfacher, das ist die paintComponent (Graphics) -Methode zu verwenden. Diese Methode wird automatisch aufgerufen, wenn das Programm denkt, dass das Objekt neu gezeichnet werden muss, z. B. Minimierung und Ermmm-Minimierung des Fensters, das das Jpanel enthält.

hier ein kurzes Beispiel ist ...

import javax.swing.JPanel; 

import java.awt.Graphics; 

import java.lang.Override; //for @Override 

class yourClass extends JPanel { //yourClass is the JPanel 
    @Override //if you aren't overriding correctly this makes the compiler tell you 
    protected void paintComponent(Graphics gr){ 
     super.paintComponent(gr); 
     gr.drawString("string literal or a string variable", 0,10); 
    } 
} 

Der Code erklärt ...

super.paintComponent (gr); Verwenden Sie beim Überschreiben immer den Super-Befehl. In diesem Fall überschreiben Sie die paintComponent-Methode von JPanel, sodass Sie wie gezeigt vorgehen. Dies ermöglicht auch inkrementelles Malen (wie ich es nannte), was bedeutet, dass das Programm den Bildschirm nicht weiß malt und dann malt, was es zu tun hat. Sie können also eine Blackbox zeichnen, dann eine Minute später eine rote Box zeichnen und die Blackbox wird nicht verschwinden.

gr.drawString (Zeichenfolge strText, int x, int y); DrawString-Methode der Grafikklasse. Graphics gr wird vom Programm über eine Reihe versteckter Methoden erstellt. Machen Sie sich also keine Sorgen, es zu erstellen, haben Sie es einfach in den paintComponent-Parametern und lassen Sie das Programm paintComponent aufrufen.

Für den drawString-Befehl sind x und y die Koordinaten, ich habe y bei 10, da die Methode aus meinen Erfahrungen wie folgt funktioniert: Aus Koordinaten (x, y) (dies ist relativ zu JPanel), zeichnen nach links und nach oben. Wenn Sie also y auf 0 setzen, wird Ihr Text vom JPanel abgezogen. Das bedeutet, dass Sie es nicht sehen können, da alles, was außerhalb des JPanels gezeichnet wird, nicht erscheint. (Ich weiß nicht, warum genau)

Das ist mit paintComponent, die effektiv funktionieren könnte, wenn Sie eine Schleife verwenden, um jede Zeile zu zeichnen; als drawString zeichnet eine einzelne Zeile. Dies ist viel einfacher als die nächste Lösung.

Die nächste Lösung verwendet Layouts. Wenn Sie jede Zeile 1 mal 1 zeichnen möchten und jedes Mal eine Zeile nach unten gehen, empfehle ich das GridLayout (Zeilen, Spalten). Wenn Sie 20 Textzeilen hätten, wäre die Methode wie neu GridLayout (20, 1);

Die Idee ist, dass Sie die Anzahl der Zeilen und Spalten zählen.

. Column 1 

Row 1

Row 2

Row 3

etc

Der Haken mit dem Gridlayout ist ein Objekt benötigen jede Zeichenfolge (in diesem Fall zu halten, I würde JLabel empfehlen).

Sie müssten auch Inkrementalbild aktiviert haben, (oder ich würde es sehr vermuten), was bedeutet, eine Klasse zu erstellen, die JLabel erweitert.

Schließlich müssen Sie auch die JLabel als Kind in den JPanel

JPanel.add(JLabel); 

Obwohl da Sie bereits einige Layout Sachen verwendet haben, dies nicht so schwer sein könnte.

Als ein Beispiel ...

import java.awt.GridLayout; 
import java.awt.Graphics; 

import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 

import java.lang.Override; 

class YourMainClass { 
    static JFrame mainFrame; 
    static YourJLabel clsLabel; 
    static JPanel pnlJPanel; 
    public static void main(String[]args){ 
     mainFrame = new JFrame("Testing"); //initialize, and set size the frame 
     mainFrame.setSize(500,500); 
     pnlJPanel = new JPanel();//initialize our panel 
     pnlJPanel.setLayout(new GridLayout(3,1));//set its layout to gridlayout, with grid of 3 rows and 1 column 
     clsLabel = new YourJLabel(); //create a jlabel, add some text to it, then add it to the jpanel 
     clsLabel.setText("some"); 
     pnlJPanel.add(clsLabel); 
     clsLabel = new YourJLabel(); 
     clsLabel.setText("Text"); 
     pnlJPanel.add(clsLabel); 
     clsLabel = new YourJLabel(); 
     clsLabel.setText("drawn"); 
     pnlJPanel.add(clsLabel); 
     mainFrame.add(pnlJPanel);//add the jpanel to the frame 
     mainFrame.pack();  //believe you already know these two lines 
     mainFrame.setVisible(true); 
    } 
} 
class YourJLabel extends JLabel { 
    YourJLabel(){ 
     super(); 
     setOpaque(true); //going on memory, by default jlabels opaque is false, or transparent 
    } 
    protected void paintComponent(Graphics gr){ 
      super.paintComponent(gr); 
    } 
} 

Dieses Beispiel macht:

enter image description here

Wenn Layouts, alles zu seinem übergeordneten relativ.

Hinweis: Wir haben keinen Zugriff mehr auf die ersten beiden JLabels. Wenn Sie während der Verwendung von Klasseninstanzen darauf zugreifen möchten, müssen Sie die Instanzen speichern, die sie von Ihnen erhalten. Der perfekte Ort, um sie zu speichern, ist in einem Array. Ein schnelles Beispiel ... YourJLabel [] aryJLabel = new YourJLabel [3];

Die [3] bestimmt die Größe des Arrays, Sie können dies nicht ändern, sobald es einmal gemacht wurde. [] auf YourJLabel bedeutet, dass Sie ein Array von YourJLabel erstellen.