Создание пользовательской кнопки JButton в Java



есть ли способ создать JButton с вашей собственной графической кнопкой, а не только с изображением внутри кнопки?



Если нет, есть ли другой способ, чтобы создать пользовательский JButton в java?

1539   5  

5 ответов:

когда я впервые изучал Java, нам пришлось сделать Yahtzee, и я подумал, что было бы здорово создавать пользовательские компоненты Swing и контейнеры вместо того, чтобы просто рисовать все на одном JPanel. Преимущество расширения Swing компоненты, конечно, должны иметь возможность добавлять поддержку сочетаний клавиш и других специальных возможностей, которые вы не можете сделать, просто имея paint() метод печати красивая картинка. Это может быть сделано не лучшим образом, однако, но это может быть хорошим началом очко в твою пользу.

Edit 8/6-если это не было видно из изображений, каждый штамп-это кнопка, которую вы можете нажать. Это переместит его в DiceContainer ниже. Глядя на исходный код, вы можете видеть, что каждая кнопка Die рисуется динамически, исходя из ее значения.

alt text
alt text
alt text

вот основные шаги:

  1. создать класс, который расширяет JComponent
  2. вызов родительского конструктора super() in ваши конструкторы
  3. убедитесь, что класс реализует MouseListener
  4. поместите это в конструктор:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. переопределить эти методы:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. переопределить этот метод:

    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

    Ничего не найдено.