Как сделать JButton c вертикальной надписью

Как сделать JButton с вертикальной надписью Как известно в Java Swing для создания кнопки в приложении используется JButton. Однако, у этой стандартной кнопки нет возможности изменять ориентацию текста надписи. По умолчанию для русской локали (не знаю, как для китайской или каой-нить еще) надписаь располагается горизонтально. Каким-то образом повлиять на это нельзя — нет нужным методов. Совсем недавно в моих «творческих изысканиях» понадобилось сделать так, чтобы у обычной кнопки надписать располагалась не горизонтально, а вертикально. Как это сделать? Давайте посмотрим дальше.

Сразу признаюсь в том, что решение придумал не я сам, а увидел его вот здесь http://forums.sun.com/thread.jspa?forumID=57&threadID=5306810, на официальном форуме. На мой взгляд решение вполне пристойное и юзабельное. Конечно я не проверял его работоспособность во всех сто тысячах случаев, поэтому в каких-то исключительных ситуациях может работать криво 🙂

Я ничего не привносил своего, а лишь честно позаимствовал чужой код и сделал небольшой тестовый пример, который можно увидеть ниже. Код кнопки я вынес в отдельный класс и назвал VerticalButton — исходное RotatedButton не понравилось 🙂 Это сам пример, который использует кнопку.

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestFrame extends JFrame {

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

		final Font font = new Font("Verdana", Font.PLAIN, 13);

		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());

		JButton button1 = new VerticalButton("Button 1", false);
		button1.setFont(font);
		button1.setPreferredSize(new Dimension(50, 100));
		panel.add(button1);

		JButton button2 = new VerticalButton("Button 2", false);
		button2.setFont(font);
		button2.setPreferredSize(new Dimension(50, 150));
		panel.add(button2);

		JButton button3 = new VerticalButton("Button 3", true);
		button3.setFont(font);
		button3.setPreferredSize(new Dimension(50, 120));
		panel.add(button3);

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

А это код собственно самой кнопки. При создании кнопки можно указывать, откуда будет брать своё начало надписать на кнопке: сверху или снизу. Смотрим код кнопки.

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JButton;
import javax.swing.JToggleButton;

class VerticalButton extends JButton {

	XButton template;
	boolean clockwise;

	VerticalButton(String text, boolean clockwise) {
		template = new XButton(text, getFont());
		this.clockwise = clockwise;

		Dimension d = template.getPreferredSize();
		setPreferredSize(new Dimension(d.height, d.width));
	}

	public void setFont(Font font) {
		super.setFont(font);
		if (template != null) {
			template.setFont(font);
		}
	}

	protected void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g.create();

		Dimension d = getSize();
		template.setSize(d.height, d.width);

		if (clockwise) {
			g2.rotate(Math.PI / 2.0);
			g2.translate(0, -getSize().width);
		} else {
			g2.translate(0, getSize().height);
			g2.rotate(-Math.PI / 2.0);
		}
		template.setSelected(this.getModel().isPressed());
		template.paintComponent(g2);
		g2.dispose();
	}

	private class XButton extends JToggleButton {
		XButton(String text, Font font) {
			super(text);
			setFont(font);
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
		}
	}
}

2 Responses to Как сделать JButton c вертикальной надписью

  1. cyper_:

    Интересно можно ли так «перевернуть» любой компонент, например JTextField?

  2. Влад:

    Огромное спасибо, эта программа ответила мне сразу на многие вопросы.

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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