【问题标题】:Trying to use actionListener to turn a String upside down尝试使用 actionListener 将字符串颠倒
【发布时间】:2017-11-20 23:39:58
【问题描述】:

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

目前我有一个使用paint() 方法和一个Graphic 对象绘制的字符串。该字符串在 JUpsideDown 框架中可见,并且它是颠倒的,位于面板的中间。我已经添加了我的按钮和一个 actionListener 但我认为我的 actionPerformed 方法中的代码是错误的,因为我试图通过乘以 -1 来使负字体大小变为正值,但是当我重新绘制时它似乎没有生效.定位的字符串移动到 x = 100 和 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);

    }

}

【问题讨论】:

  • 您的字体实例不知道您何时以及如何更改 JUpsideDown 类的 fontSize 变量......
  • 我不认为使用负字体大小会翻转文本,您需要通过负状态来缩放 Graphics 上下文,这还需要提供额外的偏移量补偿。作为一般规则,您不想覆盖像JFrame 这样的顶级容器的paint,它可能会导致无穷无尽的问题,相反,您应该从JPanel 开始并覆盖它的paintComponent 方法而不是
  • This example 演示使用负比例来翻转Graphics 上下文
  • 另一种解决方案是简单地围绕文本中心旋转 Graphics 上下文
  • @MadProgrammer 我使用负字体来显示字符串颠倒开始。有没有办法通过在 actionPerformed 方法中乘以它来简单地将 textSize 变量更改为正数?

标签: java swing paint repaint


【解决方案1】:

您的逻辑是正确的,尽管您需要再次实例化一个新的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();
    }

【讨论】:

  • font = new Font("Serif", Font.PLAIN, fontSize); //added line 这行得通,我想我尝试了一些与此非常相似的方法,但我尝试实例化一个名为“font”的新 Font 对象Font font = new Font("Serif", Font.PLAIN, fontSize); //added line 我认为这是我以前所拥有的,显然它因为字体对象已本地化为 actionPerformed 方法,所以不起作用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2013-02-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2015-12-26
相关资源
最近更新 更多