尝试使用actionListener将String颠倒

时间:2017-11-19 23:00:06

标签: java swing paint repaint

从我的教科书: “编写一个扩展JFrame的应用程序,当用户单击按钮时,该应用程序会颠倒显示一个短语。当用户再次单击该按钮时,该短语会正常显示。”

目前我有一个使用paint()方法和Graphic对象绘制的String。字符串在JUpsideDown框架中可见,它是倒置的,位于面板中间。我添加了我的按钮和一个actionListener,但我认为我的actionPerformed方法中的代码是错误的,因为我试图通过乘以-1来使负字体大小为正,但是当我重新绘制时它似乎没有生效。定位的字符串移动到x = 100 ad y = 100但字符串仍然是颠倒的。

赞赏任何形式的指导。

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);

    }

}

1 个答案:

答案 0 :(得分:0)

您的逻辑是正确的,尽管您需要再次实例化一个新的Font对象,该对象将封装新的fontsize。这应该在actionPerformed()方法中单击按钮后执行。通过这种方式,应用程序的行为将是预期的。

您可以在下面找到可能的解决方案:

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