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

typedef - ваш друг

. Вернувшись и посмотрев на многие другие ответы, я обнаружил, что более глубокое объяснение в порядке, так как многие другие ответы либо страдают от проблем с производительностью, либо вынуждают вас используйте необычный или обременительный синтаксис для объявления массива или доступа к элементам массива (или всему выше).

Во-первых, этот ответ предполагает, что вы знаете размеры массива во время компиляции. Если вы это сделаете, то это лучшее решение, так как оно обеспечит максимальную производительность и позволит использовать стандартный синтаксис массива для доступа к элементам массива.

Причина, по которой это дает лучшую производительность, заключается в том, что она распределяет все массивы как непрерывный блок памяти, что означает, что у вас, вероятно, будет меньше пропусков страниц и лучшая пространственная локальность. Выделение в цикле может привести к тому, что отдельные массивы будут разбросаны по нескольким несмежным страницам через пространство виртуальной памяти, поскольку цикл выделения может быть прерван (возможно, несколько раз) другими потоками или процессами или просто из-за усмотрения распределитель заполняет небольшие, пустые блоки памяти, которые, как оказалось, доступны.

Другими преимуществами являются простой синтаксис объявления и стандартный синтаксис доступа к массиву.

В C ++ с использованием нового:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

typedef double (array5k_t)[5000];

array5k_t *array5k = new array5k_t[5000];

array5k[4999][4999] = 10;
printf("array5k[4999][4999] == %f\n", array5k[4999][4999]);

return 0;
}

Или C-стиль с использованием calloc:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

typedef double (*array5k_t)[5000];

array5k_t array5k = calloc(5000, sizeof(double)*5000);

array5k[4999][4999] = 10;
printf("array5k[4999][4999] == %f\n", array5k[4999][4999]);

return 0;
}
93
задан Paulo Mattos 7 November 2017 в 00:39
поделиться

5 ответов

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

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

alt text
alt text
alt text

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

  1. Создают класс, который расширяется JComponent
  2. , Call порождает конструктора super() в Ваших конструкторах
  3. , Удостоверяются Вы реализации класса MouseListener
  4. Помещенный это в конструктора:

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

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

    public void paintComponent(Graphics g)
    

сумма пространства необходимо работать с тем, когда рисование кнопки определяется [1 110], принятие getMinimumSize() и getMaximumSize() возвращает то же значение. Я не экспериментировал слишком много с этим, но, в зависимости от расположения Вы используете для своего GUI, Ваша кнопка могла выглядеть полностью отличающейся.

И наконец, исходный код . В случае, если я пропустил что-либо.

89
ответ дан Lahiru Ashan 24 November 2019 в 06:19
поделиться

Вы могли всегда пробовать вид Синтезатора & чувство. Вы обеспечиваете 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 (строка) метод для идентификации то, на что должна отобразиться кнопка в 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>

связывать элемент там определяет, что отобразиться на (в этом примере, он применит то моделирование к любым кнопкам, свойство имени которых было установлено на "грязь").

И несколько полезных ссылок:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

13
ответ дан user11153 24 November 2019 в 06:19
поделиться

Да, это возможно. Один из основных профессионалов для использования 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 также нужно управлять для динамичной поддержки изменений в содержании. Необходимо соблюдать осторожность при измерении метрик шрифта и размеров изображения.

Для создания управления, на которое можно полагаться, вышеупомянутый код не является корректным подходом. Размеры и цвета являются динамичными в Swing и зависят от используемого стиля. Даже значение по умолчанию Металл взгляд изменилось через версии JRE. Было бы лучше реализовать AbstractButton и соответствовать инструкциям, изложенным API Swing. Хорошая начальная точка должна посмотреть 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 полезно для записи средств управления: Создание Пользовательского Стиля

33
ответ дан user11153 24 November 2019 в 06:19
поделиться

Я, вероятно, иду миллион миль, в заблуждении прямой (но я только молод: P). но не могли Вы добавлять диаграмму к панели и затем mouselistener к графическому объекту так, чтобы, когда пользователь на диаграмме Ваше действие будет формовано.

8
ответ дан AngelOfCake 24 November 2019 в 06:19
поделиться

Я не сделал разработки SWING начиная со своих ранних классов CS, но если бы она не была создана в Вас, то мог бы просто наследовать javax.swing.AbstractButton и создать Ваше собственное. Должно быть довольно просто соединить что-то проводом вместе с их существующей платформой.

7
ответ дан Derick 24 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: