Есть ли способ создать изображение JButton
с вашей собственной кнопкой, а не только с изображением внутри кнопки?
Если нет, есть ли другой способ создать кастом JButton
в java?
Когда я впервые изучал Java, нам нужно было создать Yahtzee, и я подумал, что было бы круто создать собственные компоненты и контейнеры Swing, а не просто рисовать все на одном JPanel
. Преимущество расширения Swing
компонентов, конечно же, состоит в том, что у вас есть возможность добавить поддержку сочетаний клавиш и других специальных возможностей, которые вы не можете сделать, просто заставив paint()
метод печатать красивую картинку. Однако это может быть сделано не лучшим образом, но это может быть хорошей отправной точкой для вас.
Редактировать 8/6 - Если это не было очевидно из изображений, каждый кубик - это кнопка, которую вы можете нажать. Это переместит его DiceContainer
вниз. Взглянув на исходный код, вы увидите, что каждая кнопка Die отрисовывается динамически в зависимости от ее значения.
Вот основные шаги:
JComponent
super()
в ваших конструкторахMouseListener
Поместите это в конструктор:
enableInputMethods(true);
addMouseListener(this);
Переопределите эти методы:
public Dimension getPreferredSize()
public Dimension getMinimumSize()
public Dimension getMaximumSize()
Переопределите этот метод:
public void paintComponent(Graphics g)
Объем пространства, с которым вы должны работать при рисовании кнопки, определяется getPreferredSize()
, предполагая getMinimumSize()
и getMaximumSize()
возвращая одно и то же значение. Я не слишком много экспериментировал с этим, но, в зависимости от макета, который вы используете для своего графического интерфейса, ваша кнопка может выглядеть совершенно иначе.
И, наконец, исходный код . На случай, если я что-то пропустил.
Да, это возможно. Одним из основных плюсов использования Swing является простота создания абстрактных элементов управления и манипулирования ими.
Вот быстрый и грязный способ расширить существующий класс JButton, чтобы нарисовать круг справа от текста.
Обратите внимание, что при переопределении paintComponent содержимое кнопки может быть изменено, но граница закрашивается методом paintBorder . GetPreferredSize метод также необходимо управлять для того , чтобы изменения поддержки динамически к содержимому. Необходимо соблюдать осторожность при измерении показателей шрифта и размеров изображения.
Для создания элемента управления, на который вы можете положиться, приведенный выше код не является правильным подходом. Размеры и цвета в Swing динамичны и зависят от используемого внешнего вида. Даже стандартный вид Metal изменился в версиях JRE. Было бы лучше реализовать AbstractButton и соответствовать руководящим принципам, изложенным в Swing API. Хорошей отправной точкой является просмотр javax.swing.LookAndFeel и javax.swing.UIManager. классов .
http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html
http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html
Понимание анатомии LookAndFeel полезно для написания элементов управления: Создание индивидуального внешнего вида и ощущений
источник
Вы всегда можете попробовать стиль Synth. Вы предоставляете XML-файл, который действует как своего рода таблица стилей, вместе с любыми изображениями, которые вы хотите использовать. Код может выглядеть так:
Оттуда продолжайте и добавьте свой JButton, как обычно. Единственное изменение состоит в том, что вы используете метод setName (string) для определения того, чему должна соответствовать кнопка в XML-файле.
Файл xml может выглядеть так:
Элемент bind указывает, что нужно сопоставить (в этом примере он применит этот стиль к любым кнопкам, свойство name которых установлено на «грязь»).
И еще пара полезных ссылок:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html
источник
Я, наверное, проеду миллион миль по неправильному маршруту (но я еще молод: P). но не могли бы вы добавить графику на панель, а затем мышеловку к графическому объекту, чтобы когда пользователь на графике выполнял ваше действие.
источник
Я не занимался разработкой SWING со времен моих первых классов CS, но если бы он не был встроен, вы могли бы просто наследовать
javax.swing.AbstractButton
и создавать свои собственные. Должно быть довольно просто связать что-то с существующей структурой.источник