Показать текст в Swing без JLabel

Мне нужно сделать Java-программу с помощью Swing, и я хочу показать какой-то текст, но не используя JLabel (включая текстовый компонент)! Я должен расширять JFrame. Какие еще варианты у меня есть?

1 ответ

Вы не должны:

  • Не используйте JFrame без необходимости
  • Нарисуйте непосредственно JFrame через paint(..)

Вы должны:

  • override JComponent paintComponent(...)
  • выполните обычную покраску в paintComponent(...),
  • добавить JComponent экземпляр в JFrame

Вот вам пример:

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);
 }
}

UPDATE:

В соответствии с вашим комментарием , хотя он противоречит всем правилам Swing и моей собственной морали:

Однако, если вам еще нужно сделать это (что я не могу понять, почему это просто плохая практика), вот как:

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);
 }
}

licensed under cc by-sa 3.0 with attribution.