我正在尝试创建一个JFrame
,显示每个偶数字体大小从4到24的字符串。为此,我尝试执行for循环,创建drawString
使用每次增加+2字体大小的Font
。通过获取前一个drawString
并将其添加到变量getHeight()
,尝试将下一个y
置于上一个JFrame
之下。但是,程序运行时import javax.swing.*;
import java.awt.*;
public class JFontSizeDemo extends JFrame {
int x = 10;
int y = 40;
int heightOfFont;
public void paint(Graphics g) {
super.paint(g);
for(int size = 4; size <= 24; size += 2) {
g.setFont(new Font("Arial", Font.BOLD, size));
g.drawString("Name", x, y);
heightOfFont = g.getFontMetrics().getHeight();
y += heightOfFont;
}
}
public static void main(String[] args) {
JFontSizeDemo frame = new JFontSizeDemo();
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
为空。
我哪里出错?
{{1}}
答案 0 :(得分:2)
不要直接在JFrame
上绘画,这是一个顶级容器。使用JComponent
或JPanel
。覆盖paintComponent()
进行绘画而不是paint()
。
请查看Performing Custom Painting教程以获取更多详细信息和示例。
以下是代码的略微修改示例:
import javax.swing.*;
import java.awt.*;
public class FontSizeDemo {
private static void createAndShowUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int y = 0;
for(int size = 4; size <= 24; size += 2) {
g.setFont(new Font("Arial", Font.BOLD, size));
g.drawString("Name", 0, y);
int heightOfFont = g.getFontMetrics().getHeight();
y += heightOfFont;
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
frame.add(panel);
frame.setLocationByPlatform(true);
frame.setVisible(true);
frame.pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
除了为绘画引入JPanel
之外,还有一个y
坐标的快速微小修正,以确保文本在重绘后保留在同一个位置。还有SwingUtilities.invokeLater
。此外,通常根本不需要扩展JFrame
。