【发布时间】: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 变量更改为正数?