5 ответов:
когда я впервые изучал Java, нам пришлось сделать Yahtzee, и я подумал, что было бы здорово создавать пользовательские компоненты Swing и контейнеры вместо того, чтобы просто рисовать все на одном
JPanel. Преимущество расширенияSwingкомпоненты, конечно, должны иметь возможность добавлять поддержку сочетаний клавиш и других специальных возможностей, которые вы не можете сделать, просто имеяpaint()метод печати красивая картинка. Это может быть сделано не лучшим образом, однако, но это может быть хорошим началом очко в твою пользу.Edit 8/6-если это не было видно из изображений, каждый штамп-это кнопка, которую вы можете нажать. Это переместит его в
DiceContainerниже. Глядя на исходный код, вы можете видеть, что каждая кнопка Die рисуется динамически, исходя из ее значения.
вот основные шаги:
- создать класс, который расширяет
JComponent- вызов родительского конструктора
super()in ваши конструкторы- убедитесь, что класс реализует
MouseListenerпоместите это в конструктор:
enableInputMethods(true); addMouseListener(this);переопределить эти методы:
public Dimension getPreferredSize() public Dimension getMinimumSize() public Dimension getMaximumSize()переопределить этот метод:
public void paintComponent(Graphics g)объем пространства, с которым вы должны работать при рисовании кнопки, определяется
getPreferredSize(), предполагая, чтоgetMinimumSize()иgetMaximumSize()возвращает то же значение. Я не экспериментировал слишком много с этим, но, в зависимости от макета, который вы используете для своего графического интерфейса, ваша кнопка может выглядеть совершенно по-другому.и наконец,исходный код. На случай, если я что-то упустил.
Да, это возможно. Одним из главных плюсов использования Swing является легкость, с которой абстрактные элементы управления могут быть созданы и манипулировать.
вот быстрый и грязный способ расширить существующий класс JButton, чтобы нарисовать круг справа от текста.
package test; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; public class MyButton extends JButton { private static final long serialVersionUID = 1L; private Color circleColor = Color.BLACK; public MyButton(String label) { super(label); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Dimension originalSize = super.getPreferredSize(); int gap = (int) (originalSize.height * 0.2); int x = originalSize.width + gap; int y = gap; int diameter = originalSize.height - (gap * 2); g.setColor(circleColor); g.fillOval(x, y, diameter, diameter); } @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); size.width += size.height; return size; } /*Test the button*/ public static void main(String[] args) { MyButton button = new MyButton("Hello, World!"); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); Container contentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(button); frame.setVisible(true); } }обратите внимание, что путем переопределения paintComponent что содержимое кнопки может быть изменено, но что граница окрашена paintBorder метод. Этот getPreferredSize метод также должен управляться для динамической поддержки изменений в содержании. Необходимо соблюдать осторожность при измерении метрик шрифтов и размеров изображений.
для создания элемента управления, на который можно положиться, приведенный выше код не является правильным подходом. Размеры и цвета динамичны в качании и зависят на будучи использованными взгляде и чывстве. Даже по умолчанию металл внешний вид изменился в версиях JRE. Было бы лучше реализовать AbstractButton и в соответствии с руководящими принципами, изложенными качания API-интерфейс. Хорошей отправной точкой является взгляд на javax.качать.Внешний вид и javax.качать.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 является полезно для написания элементов управления: создание пользовательского внешнего вида
ты всегда можешь попробовать синтезатор выглядеть и чувствовать себя. Вы предоставляете xml-файл, который действует как своего рода таблица стилей, а также любые изображения, которые вы хотите использовать. Код может выглядеть так:
try { SynthLookAndFeel synth = new SynthLookAndFeel(); Class aClass = MainFrame.class; InputStream stream = aClass.getResourceAsStream("\default.xml"); if (stream == null) { System.err.println("Missing configuration file"); System.exit(-1); } synth.load(stream, aClass); UIManager.setLookAndFeel(synth); } catch (ParseException pe) { System.err.println("Bad configuration file"); pe.printStackTrace(); System.exit(-2); } catch (UnsupportedLookAndFeelException ulfe) { System.err.println("Old JRE in use. Get a new one"); System.exit(-3); }оттуда, продолжайте и добавьте свою JButton, как обычно. Единственное изменение заключается в том, что вы используете метод setName(string) для определения того, что кнопка должна отображать в xml-файле.
XML-файл может выглядеть так:
<synth> <style id="button"> <font name="DIALOG" size="12" style="BOLD"/> <state value="MOUSE_OVER"> <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/> <insets top="2" botton="2" right="2" left="2"/> </state> <state value="ENABLED"> <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/> <insets top="2" botton="2" right="2" left="2"/> </state> </style> <bind style="button" type="name" key="dirt"/> </synth>элемент привязки есть указывает, что нужно сопоставить (в этом примере он будет применять этот стиль к любым кнопкам, свойство name которых было установлено в "грязь").
и несколько полезных ссылок:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html
Я, вероятно, иду на миллион миль в неправильном прямом (но я только молодой :P). но не могли бы вы добавить графику на панель, а затем mouselistener к графическому объекту, чтобы, когда пользователь на графике, ваше действие было предварительно сформировано.
Я не занимался разработкой SWING с моих ранних классов CS, но если бы он не был встроен, вы могли бы просто наследовать
javax.swing.AbstractButtonи создать свой собственный. Должно быть довольно просто подключить что-то вместе с их существующей структурой.



Comments