Vă mulțumim pentru susținere

Crearea unui JButton personalizat în Java

Există o modalitate de a crea un JButton cu propriul dvs. buton grafic și nu doar cu o imagine în interiorul butonului?

Dacă nu, există o altă modalitate de a crea un cod JButton personalizat în Java?

0
adăugat editat
Vizualizări: 1

5 răspunsuri

Când am început să învăț Java, a trebuit să facem Yahtzee și am crezut că ar fi interesant să creez componente și containere personalizate Swing în loc să trag totul pe un JPanel . Beneficiul de a extinde componentele Swing , desigur, este de a avea capacitatea de a adăuga suport pentru comenzile rapide de la tastatură și alte caracteristici de accesibilitate pe care nu le puteți face doar printr-o paint() code> metoda tipărește o imagine frumoasă. Este posibil să nu se facă cel mai bun mod cu toate acestea, dar poate fi un bun punct de plecare pentru dvs.

Editare 8/6 - Dacă nu a fost evident din imagini, fiecare Die este un buton pe care îl puteți face clic. Aceasta va duce la DiceContainer de mai jos. Privind codul sursă, puteți vedea că fiecare buton Die este extras dinamic, pe baza valorii sale.

alt text
alt text
alt text

Iată pașii de bază:

  1. Create a class that extends JComponent
  2. Call parent constructor super() in your constructors
  3. Make sure you class implements MouseListener
  4. Put this in the constructor:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Override these methods:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Override this method:

    public void paintComponent(Graphics g)
    

Cantitatea de spațiu cu care trebuie să lucrați la desenarea butonului este definită de getPreferredSize() , presupunând că getMinimumSize() și getMaximumSize() aceeași valoare. Nu am experimentat prea mult cu acest lucru, dar, în funcție de aspectul pe care îl utilizați pentru GUI, butonul dvs. ar putea arăta complet diferit.

În final, cod sursă . În cazul în care am pierdut nimic.

0
adăugat
Puteți pune întregul cod aici.
adăugat autor Doug Hauf
Bună, mulțumesc mai întâi pentru cod! Aș sugera să adăugați codul "setActionComme (Command String)". este unul dintre modurile de a filtra evenimentele în Swing. (dar apoi puteți argumenta că există 1001 lucruri care ar putea fi adăugate pentru a face lucrurile ușor mai bune: P)
adăugat autor Jason Rogers
Pentru a crea o matriță pe care o puteți apăsa, puteți utiliza de fapt un JButton simplu (mai degrabă decât subclasarea sau crearea unui JComponent personalizat), profitând de funcția setIcon / setPressedIcon, precum și de alte funcții în JButton
adăugat autor ControlAltDel

You could always try the Synth look & feel. You provide an xml file that acts as a sort of stylesheet, along with any images you want to use. The code might look like this:

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

De acolo, continuați și adăugați JButton-ul dvs. ca în mod normal. Singura modificare este că utilizați metoda setName (șir) pentru a identifica ce trebuie să facă mapul butonului în fișierul xml.

Fișierul xml ar putea arăta astfel:


    
    

Elementul de legare de acolo specifică la ce să se hartă (în acest exemplu, va aplica acel stil pentru orice buton al cărui nume a fost setat la "murdărie").

Și câteva linkuri utile:

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

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

0
adăugat

Da, acest lucru este posibil. Unul dintre principalii profesioniști care folosesc Swing este ușurința cu care se pot crea și manipula controalele abstracte.

Iată o modalitate rapidă și murdară de extindere a clasei JButton existente pentru a desena un cerc în partea dreaptă a textului.

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

}

Rețineți că prin suprascrierea paintComponent că conținutul butonului poate fi schimbat, dar că marginea este vopsită prin metoda paintBorder . Metoda getPreferredSize trebuie, de asemenea, să fie gestionată pentru a sprijini dinamic modificările aduse conținutului. Trebuie să aveți grijă atunci când măsurați valorile fontului și dimensiunile imaginii.

Pentru a crea un control pe care vă puteți baza, codul de mai sus nu este abordarea corectă. Dimensiunile și culorile sunt dinamice în Swing și sunt dependente de aspectul și simțul folosit. Chiar și aspectul implicit Metal sa modificat în versiunile JRE. Ar fi mai bine să implementați AbstractButton și să respectați instrucțiunile stabilite de API-ul Swing. Un bun punct de plecare este să examinați clasele javax.swing.LookAndFeel și 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

Understanding the anatomy of LookAndFeel is useful for writing controls: Creating a Custom Look and Feel

0
adăugat

Nu am facut o dezvoltare SWING inca de la inceputul claselor CS, dar daca nu a fost construita, ai putea mosteni doar javax.swing.AbstractButton si sa-ti creezi propriul. Ar trebui să fie destul de simplu să conectezi ceva împreună cu cadrul lor existent.

0
adăugat

Probabil că merg într-un milion de mile în direcția greșită (dar eu sunt doar tânăr: P). dar nu ați putut să adăugați graficul într-un panou și apoi un player de muzică la obiectul grafic, astfel încât atunci când utilizatorul de pe grafic acțiunea dvs. este preformate.

0
adăugat
Acest lucru ar funcționa, dar aș prefera să folosesc standardul JButton decât să creez un tip de buton, dacă este posibil.
adăugat autor Anton