Vytvoření vlastní JButton v Javě

hlasů
86

Existuje způsob, jak vytvořit JButtons vaší vlastní tlačítko grafikou a ne jen s obrazem uvnitř tlačítka?

Pokud tomu tak není, je tam jiný způsob, jak vytvořit vlastní JButtonv Javě?

Položena 05/08/2008 v 13:15
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
85

Když jsem byl poprvé učit Javu jsme museli udělat Yahtzee a myslel jsem, že to bude v pohodě vytvořit vlastní Swing komponenty a kontejnery, ne jen kreslení vše na jednom JPanel. Přínosem vystupujících Swingkomponentů, je samozřejmě mít možnost přidat podporu pro klávesové zkratky a další funkce usnadnění přístupu, které nemůžete udělat jen tím, že má paint()způsob tisku pěkný obrázek. Nemusí to být provedeno nejlepší způsob, nicméně, ale to může být dobrým výchozím bodem pro vás.

Editovat 8/6 - Kdyby nebylo patrné z obrázků, z nichž každá Die je k dispozici tlačítko můžete kliknout. To bude přesunout na DiceContainerníže. Podíváme-li se do zdrojového kódu je vidět, že každé tlačítko Die Je třeba dynamicky na základě své hodnoty.

alt textu
alt textu
alt textu

Zde jsou základní kroky:

  1. Vytvořte třídu, která rozšiřuje JComponent
  2. Call rodič konstruktér super()ve svých konstruktérů
  3. Ujistěte se, že třída implementuje MouseListener
  4. Dát do konstruktoru:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Přepsat tyto metody:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Přepsat tuto metodu:

    public void paintComponent(Graphics g)
    

Množství místa, budete muset pracovat s při kreslení vaše tlačítko je definován getPreferredSize()za předpokladu, getMinimumSize()a getMaximumSize()vrátí stejnou hodnotu. Nemám experimentoval moc s tím, ale v závislosti na uspořádání používáte pro GUI vaše tlačítko mohlo vypadat úplně jinak.

A konečně, zdrojový kód . V případě, že jsem vynechal něco.

Odpovězeno 05/08/2008 v 14:03
zdroj uživatelem

hlasů
32

Ano, je to možné. Jedním z hlavních kladů pro používání Swing je snadnost, s jakou mohou být abstraktní kontroly vytvořené a manipuluje.

Zde je rychlý a špinavý způsob, jak rozšířit stávající třídu JButton nakreslit kružnici napravo od textu.

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

}

Všimněte si, že naléhavým paintComponent že obsah tlačítka lze změnit, ale že hranice je namaloval paintBorder metodou. GetPreferredSize metoda musí být rovněž řízen tak, aby se dynamicky podporovat změny obsahu. Péče je třeba vzít při měření písmo metriky a rozměry obrázku.

Pro vytvoření ovládací prvek, který se můžete spolehnout, výše uvedený kód není správný přístup. Rozměry a barvy jsou dynamické swing a jsou závislé na vzhled a dojem používán. Dokonce i výchozí Metal vzhled změnil přes JRE verze. Že by bylo lepší zavést AbstractButton a v souladu s pokyny stanovenými Swing API. Dobrým výchozím bodem je podívat se na javax.swing.LookAndFeel a javax.swing.UIManager tříd.

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

Pochopení anatomie LookAndFeel je vhodný pro psaní ovládací prvky: Vytvoření vlastního vzhledu a prostředí

Odpovězeno 05/08/2008 v 13:53
zdroj uživatelem

hlasů
12

Dalo by se vždy zkusit Synth vypadat a cítit. Uvedete soubor XML, který působí jako jakési stylů, spolu se všemi obrázky, které chcete použít. Kód může vypadat například takto:

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

Odtud dál a přidejte JButton jako obvykle. Jedinou změnou je, že použití metody setName (string) zjistit, jaké tlačítko by měl mapovat v souboru XML.

Soubor xml může vypadat například takto:

<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>

Bind element tu určuje, co k mapování (v tomto případě to bude platit, že styl jakýchkoli tlačítek, jejichž majetek název byl nastaven na „špína“).

A pár užitečných odkazů:

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

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

Odpovězeno 05/08/2008 v 13:47
zdroj uživatelem

hlasů
8

Jsem asi bude milion mil za špatné přímé (ale já jsem jen mladých: P). ale nemohl přidat grafiku do panelu a pak se mouselistener do grafického objektu, takže když uživatel na grafickém vaši akci je předem.

Odpovězeno 20/08/2008 v 16:48
zdroj uživatelem

hlasů
6

Neudělal jsem vývoj SWING od mých prvních tříd CS ale pokud to nebyl postaven za vás mohl zdědit javax.swing.AbstractButton a vytvořit vlastní. By měl být poměrně jednoduchý na drát něco společně s jejich stávajícím rámci.

Odpovězeno 05/08/2008 v 13:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more