2017-11-19 4 views
1

Aus meinem Lehrbuch: "Schreiben Sie eine Anwendung, die JFrame erweitert und eine Phrase auf den Kopf stellt, wenn der Benutzer auf eine Schaltfläche klickt. Die Phrase wird normal angezeigt, wenn der Benutzer auf die Schaltfläche klickt nochmal."Versuch, actionListener zu verwenden, um eine Zeichenfolge umzudrehen

Derzeit habe ich eine Zeichenfolge, die mit der paint() -Methode und einem Grafikobjekt gezeichnet wird. Der String ist im JUpsideDown-Frame sichtbar und steht in etwa in der Mitte des Panels. Ich habe meine Schaltfläche und einen actionListener hinzugefügt, aber ich denke, dass der Code in meiner actionPerformed-Methode falsch ist, weil ich versuche, die negative Schriftgröße durch Multiplikation mit -1 positiv zu machen, aber sie scheint nicht zu wirken, wenn ich neu streiche . Der String positioniert wird nach x = 100 ad y = 100 bewegt, aber der String ist immer noch auf dem Kopf stehend.

Jede Art von Anleitung wird geschätzt.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
@SuppressWarnings("serial") 
public class JUpsideDown extends JFrame implements ActionListener 
{ 
    int x = 350; 
    int y = 100; 
    int fontSize = -26; 
    Font font = new Font("Serif", Font.PLAIN, fontSize); 
    JButton press = new JButton("Flip Text"); 
    String label = "Look at this text, it will flip!"; 

    public JUpsideDown() 
    { 
     setTitle("JUpsideDown"); 
     setLayout(new FlowLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(press); 
     press.addActionListener(this); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
     g.setFont(font); 
     g.drawString(label, x, y); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     fontSize = fontSize * -1; 
     x = 100; 
     y = 100; 
     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     JUpsideDown frame = new JUpsideDown(); 
     frame.setSize(450, 200); 
     frame.setVisible(true); 

    } 

} 
+0

Ihre Schriftart Beispiel würde nicht wissen, wann und wie Sie die Variable size der JUpsideDown Klasse ändern .... –

+1

Ich glaube nicht eine Verwendung Negative Schriftgröße wird den Text umdrehen, Sie müssten den Graphics-Kontext stattdessen durch einen negativen Zustand skalieren, was auch einen zusätzlichen Offset zur Kompensation erfordern würde. Als allgemeine Regel gilt, dass Sie 'paint' von Top-Level-Containern wie' JFrame' nicht überschreiben wollen, da dies zu Problemen führen kann. Stattdessen sollten Sie mit 'JPanel' beginnen und stattdessen die 'paintComponent'-Methode überschreiben – MadProgrammer

+0

[Dieses Beispiel] (https://StackOverflow.com/Questions/24522458/flipping-rotations-and-images/24523176#24523176) demonstriert die Verwendung einer negativen Skala zum Umdrehen des 'Graphics'-Kontextes. – MadProgrammer

Antwort

0

Ihre Logik ist richtig, obwohl Sie wieder ein neues Font Objekt instanziiert müssen, die die neue fontsize einkapseln wird. Dies sollte durchgeführt werden, nachdem die Schaltfläche innerhalb actionPerformed() Methode geklickt wurde. Auf diese Weise wird das Verhalten der Anwendung erwartet.

Unten können Sie eine mögliche Lösung finden:

public void actionPerformed(ActionEvent e) 
    { 
     fontSize = fontSize * -1; 
     x = 100; 
     y = 100; 
     font = new Font("Serif", Font.PLAIN, fontSize); //added line 
     repaint(); 
    } 
+0

'font = new Schriftart (" Serif ", Font.PLAIN, fontSize); // added line' Das funktioniert und ich glaube, ich habe versucht, etwas sehr ähnliches, aber ich habe versucht, ein neues Font-Objekt mit dem Namen "font" 'Font font = neue Schriftart (" Serif ", Font.PLAIN, fontSize) ; // added line' Ich denke, das ist, was ich vorher hatte und offensichtlich würde es nicht funktionieren, weil das Font-Objekt auf die Methode actionPerformed lokalisiert ist. Vielen Dank! –

Verwandte Themen