Vra

Is daar'n manier om te skep'n JButton met jou eie knoppie grafiese en nie net met'n beeld van die binnekant van die knoppie?

Indien nie, is daar'n ander manier om te skep'n persoonlike JButton in java?

Was dit nuttig?

Oplossing

Wanneer ek die eerste keer Java geleer het moes ons Yahtzee maak en ek het gedink dit sou cool wees om persoonlike Swing komponente en houers te skep in plaas van net teken alles op een JPanel. Die voordeel van die uitbreiding van Swing komponente, natuurlik, is om die vermoë om ondersteuning te bied vir kortpadsleutels en ander toeganklikheid funksies wat jy nie net kan doen deur 'n paint() metode druk 'n mooi prentjie nie. Dit kan nie die beste manier gedoen word egter maar dit kan 'n goeie beginpunt vir jou.

Edit 06/08 - As dit was nie duidelik uit die beelde, elk Die is 'n knoppie wat jy kan klik. Dit sal dit skuif na die onderstaande DiceContainer. As ons kyk na die bron-kode kan jy sien dat elke Die knoppie dinamiese getrek word, op grond van sy waarde.

alt text
alt text
alt text

Hier is die basiese stappe:

  1. Skep 'n klas wat strek JComponent
  2. Call ouer constructor super() in jou vervaardigerskampioenskap
  3. Maak seker dat jy die klas implemente MouseListener
  4. Sit dit in die constructor:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. ignoreer hierdie metodes:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. ignoreer hierdie metode:

    public void paintComponent(Graphics g)
    

Die hoeveelheid spasie wat jy het om te werk met toe teken jou knoppie word gedefinieer deur getPreferredSize(), in die veronderstelling getMinimumSize() en getMaximumSize() dieselfde waarde terug te keer. Ek het nie te veel eksperimenteer met hierdie, maar, afhangende van die uitleg wat jy gebruik vir jou GUI jou knoppie kan heeltemal anders lyk.

En laastens, die bronkode . In geval gemis ek niks.

Ander wenke

Ja, dit is moontlik.Een van die belangrikste voordele vir die gebruik van Swing is die gemak waarmee die abstrakte beheer geskep kan word en manipuleer.

Hier is'n vinnige en vuil manier om uit te brei die bestaande JButton klas te trek'n sirkel om die regte van die teks.

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

}

Let daarop dat deur die oorheersende paintComponent wat die inhoud van die knoppie kan verander word, maar dat die grens is geverf deur die paintBorder metode.Die getPreferredSize metode moet ook bestuur word ten einde die dinamiese ondersteuning veranderinge aan die inhoud.Sorg moet geneem word wanneer die meet font statistieke en beeld dimensies.

Vir die skep van'n beheer wat jy kan staatmaak op, die bo-kode is nie die korrekte benadering.Dimensies en kleure is dinamies in Swing en is afhanklik van die lyk en voel wat gebruik word.Selfs die standaard Metaal kyk verander het oor JRE weergawes.Dit sou beter wees om te implementeer AbstractButton en voldoen aan die riglyne soos uiteengesit deur die Swaai van die API.'n goeie beginpunt is om te kyk na die javax.swaai.LookAndFeel en javax.swaai.UIManager klasse.

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

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

Begrip van die anatomie van LookAndFeel is nuttig vir die skryf van beheer:Die skep van'n Persoonlike Voorkoms en Voel

Jy kan altyd probeer om die Synth look & feel. Jy verskaf 'n XML-lêer wat optree as 'n soort van style, saam met enige beelde wat jy wil gebruik. Die kode kan soos volg lyk:

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

Van daar, gaan op en voeg jou JButton soos jy normaalweg sou doen. Die enigste verandering is dat jy die metode setName (string) gebruik om te bepaal wat die knoppie moet karteer om in die XML-lêer.

Die XML-lêer kan soos volg lyk:

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

Die bind element daar bepaal wat om te karteer om (in hierdie voorbeeld, sal dit dat stilering van toepassing op enige knoppies met die naam van eiendom is ingestel om "vuil").

En 'n paar nuttige skakels:

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

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

Ek is waarskynlik gaan 'n miljoen myl in die verkeerde direkte (maar ek is net jong: P). maar kon nie u die grafiese 'n mouselistener voeg aan 'n paneel en dan na die grafiese voorwerp sodat wanneer die gebruiker op die grafiese jou optrede is vir gevorm.

Ek het nie gedoen SWING ontwikkeling sedert my vroeë CS klasse, maar as dit nie was gebou in wat jy kan net in besit javax.swing.AbstractButton en skep jou eie. Moet eenvoudig wees om iets saam met hul bestaande raamwerk bedraad.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top