【问题标题】:Looped drawString not appearing in JFrame循环的drawString没有出现在JFrame中
【发布时间】:2013-03-30 17:37:08
【问题描述】:

我正在尝试创建一个 JFrame,它以从 4 到 24 的每个偶数字体大小显示一个字符串。为此,我正在尝试执行一个 for 循环,该循环创建一个使用 @987654325 的 drawString @ 每次都会增加 +2 字体大小。通过获取前一个的getHeight() 并将其添加到变量y 中,试图将下一个drawString 放在前一个的下方。但是,当程序运行时,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);
    }
}

【问题讨论】:

  • 对我来说很好用。你在用什么?规格?
  • 这个example,也许能解释一下关于话题的问题。为此,您需要paintImmediately(...)
  • @GagandeepBali 你试过代码了吗?它运行了!
  • @joeyrohan :有时人们可以看到或听到的并不是正确的事情 :-) 我想它只会立即显示最后一个值,而不会显示中间字符串文字值。是的,它确实可以运行,虽然在我这边也是 :-)
  • @GagandeepBali 当然直接在JFrame 上绘画不是一件正确的事情,但我的意思不是关于上帝/坏东西。”但是当程序运行时 JFrame 是空的”。但我确实得到了 OP 想要的东西:p

标签: java swing jframe drawstring


【解决方案1】:

不要直接在JFrame 上绘画,这是一个顶级容器。使用JComponentJPanel。覆盖 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

【讨论】:

  • +1 这个很好的例子,实际上保持访问说明符为protected 而不是public :-)
猜你喜欢
  • 2015-01-03
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多