FontMetrics — как узнать размер строки или символа в Java Swing

Каждый пользователь проводника Windows сто тысяч раз наблюдал следующую картину — как только строка названия файла или папки слишком большая, то она обрезается и вместо недостающих символов добавляется многоточие. Как и при помощи чего такое можно сделать на Java Swing? Давайте посмотрим.

Чтобы узнать размер определенной строки определенного шрифта в Java есть специальный класс FontMetrics, который хранит подобную информацию и позволяет вычислить требуемые размеры. Как же получить ссылку на FontMetrics. К примеру, нам необходимо получить FontMetrics компонента JLabel, для которого хотим сделать добавление многоточия при слишком длинном тексте. Сделать это можно вот так.

JLabel label = new JLabel("Test label");
Graphics g = label.getGraphics();
FontMetrics fm = g.getFontMetrics();

Вот и всё. Сначала получается ссылка на Graphics, на котором рисуется сам JLabel, а затем из него при помощи метода getFontMetrics получается ссылка на FontMetrics.

Если посмотреть на методы FontMetrics, то можно увидеть charWidth, который возвращает ширину требуемого символа, или getHeight, возвращающий высоты строки и много других. Рассмотрим их чуть ниже. А пока нам интересен метод stringWidth, который возвращает ширину в пикселах строки, которая передается методу в качестве параметра. С помощью него определяется ширина тестовой строки в тестовом примере. Тестовый пример — это окно с двумя компонентами JLabel и JTextField. В текстовое поле мы вводим строку. которая сразу же выводится в JLabel. Если ширина этой строки больше определенного значения, то строка обрезается и в конце добавляется многоточие вот так.

FontMetrics

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestFrame extends JFrame {

	public static void createGUI() {
		JFrame frame = new JFrame("Test frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

		final JLabel label = new JLabel();
		label.setPreferredSize(new Dimension(150, 200));
		label.setHorizontalAlignment(JLabel.CENTER);
		label.setAlignmentX(JLabel.CENTER_ALIGNMENT);
		label.setFont(new Font("Verdana", Font.PLAIN, 20));
		panel.add(label);

		final JTextField textField = new JTextField();
		textField.setAlignmentX(JTextField.CENTER_ALIGNMENT);
		
		textField.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {
				String fullText = textField.getText();
				String newText = "";

				for (int i = 0; i <= fullText.length(); i++) {
					String text = fullText.substring(0, i);
					Graphics g = label.getGraphics();
					FontMetrics fm = g.getFontMetrics(); 
					int width = fm.stringWidth(text);
					
					if (width > 200) {
						newText += "...";
						break;
					}
					
					newText = text;
				}

				label.setText(newText);
			}
		});
		
		panel.add(textField);

		frame.getContentPane().add(panel);
		frame.setPreferredSize(new Dimension(250, 200));
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				createGUI();
			}
		});
	}
}

Использовать все методы класса FontMetrics не доводилось, но хотелось бы по ним пробежаться. Думаю сделать это в следующем посте.

2 Responses to FontMetrics — как узнать размер строки или символа в Java Swing

  1. badmod:

    спасибо!
    ps исправь тему «Как узнать размер строки или сОмвола».

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: