在没有JLabel的Swing中显示文本

时间:2012-10-23 17:31:59

标签: java swing jframe

我必须使用Swing创建Java程序,我想显示一些文本,但不使用JLabel(包括文本组件)!我必须延长JFrame。我还有其他选择吗?

1 个答案:

答案 0 :(得分:4)

你不应该:

  • 不必要地延长JFrame
  • 通过JFrame
  • 直接抽到paint(..)

你应该:

  • 覆盖JComponent s paintComponent(...)
  • paintComponent(...)
  • 中进行自定义绘画
  • JComponent个实例添加到JFrame

以下是您的示例:

enter image description here

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class DrawSimpleText {

    public DrawSimpleText() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DrawSimpleText();
            }
        });
    }

    private void initComponents() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new JPanel(true) {
            Font font = new Font("Serif", Font.PLAIN, 20);
            String s = "Java Source and Support";

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;

                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                g2.setFont(font);

                FontMetrics fm = g.getFontMetrics(font);

                int width = fm.stringWidth(s);

                Dimension d = getSize();

                //center String/text
                int cx = (d.width - width) / 2;
                int cy = (d.height - fm.getHeight()) / 2 + fm.getAscent();

                g2.drawString(s, cx, cy);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 100);
            }
        });
        f.pack();
        f.setVisible(true);
    }
}

<强>更新

根据您的评论虽然它违反了所有Swing规则和我自己的道德

但是如果你仍然需要来做这件事(我无法理解为什么这只是不好的做法),这里是如何:

enter image description here

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DrawSimpleText extends JFrame {

    public DrawSimpleText() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DrawSimpleText();
            }
        });
    }

    private void initComponents() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    Font font = new Font("Serif", Font.PLAIN, 20);
    String s = "Java Source and Support";

    @Override
    public void paint(Graphics g) {

        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setFont(font);

        FontMetrics fm = g.getFontMetrics(font);

        int width = fm.stringWidth(s);

        Dimension d = getSize();

        //center String/text
        int cx = (d.width - width) / 2;
        int cy = (d.height - fm.getHeight()) / 2 + fm.getAscent();

        g2.drawString(s, cx, cy);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 100);
    }
}