Domanda

Sto facendo un progetto in cui ho bisogno di alcuni componenti Swing personalizzati. Finora ho fatto un nuovo pulsante con una serie di immagini (l'aspetto Java metallo non va bene con la mia interfaccia utente a tutti). Ive ha implementato MouseListener su questo nuovo componente e questo è dove si pone un problema mio. Il mio widget di cambia immagine al passaggio del mouse, cliccare ecc tranne le mie scelte MouseListener fino all'entrata del mouse in un intero contenitore del GridLayout anziché nell'immagine. Così Ho un'immagine di circa 200 * 100 e il contenitore circostante è di circa 400 * 200 e il metodo mouseEntered viene attivato quando entra quella sezione GridLayout (anche spaziali parti vuote di esso) anziché sull'immagine. Come posso fare in modo che esso è sparato solo quando il mouse sopra l'immagine? Ive dimensioni impostazione provato da gigante e altri attributi senza alcun risultato.

EDIT: Ecco una dimostrazione del mio problema. Come si può vedere (sorta di, i colori sono molto simili) il pulsante in basso a destra è evidenziato semplicemente inserendo la sua sezione del GridlLayout. Io lo voglio solo evidenziato quando sono sopra l'immagine reale, non la sezione GridLayout.

alt text

Non vorrei aggiungere i metodi MouseListener perché semplicemente coinvolgono il passaggio l'immagine visualizzata.

public customWidget()
{
    this.setLayout(new FlowLayout());
    try {
        imageDef=ImageIO.read(new File("/home/x101/Desktop/buttonDef.png"));
        imageClick=ImageIO.read(new File("/home/x101/Desktop/buttonClick.png"));
        imageHover=ImageIO.read(new File("/home/x101/Desktop/buttonHover.png"));
        current=imageDef;
    } catch (IOException e) 
    {

        e.printStackTrace();
    }
    this.addMouseListener(this);
}

protected void paintComponent(Graphics g)
{
    super.paintComponents(g);
    g.drawImage(current, 0, 0, current.getWidth(), current.getHeight(), null);

}

EDIT: aggiunta sezione di codice

È stato utile?

Soluzione

Presumo la vostra immagine contiene solo 4 oggetti 'customWidget' (in una griglia 2x2).

Il codice funziona come mi sarei aspettato. I metodi di MouseListener rispondono a MouseEvents per 'customWidget' (non l'immagine disegnati in 'customWidget'), che è dimensionato per prendere 1/4 dell'immagine, in modo che rispondono quando entra nell'area ingrandita. L'errore è in realtà nel programma di test, perché si consente al widget di pulsante personalizzato per essere più grande dell'immagine.

Se si desidera un programma di test che fornisce un'immagine simile al tuo, è necessario creare una griglia più grande (per esempio 4x4), e quindi inserire solo i pulsanti in ogni altro nodo della griglia. Posizionare un componente vuoto nelle fessure.

Altri suggerimenti

In alternativa, si consideri la Il pulsante API , che include il metodo setRolloverIcon() "per rendere la visualizzazione dei pulsanti l'icona specificata quando il cursore passa sopra di esso."

Addendum: Ad esempio, ,

import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ButtonIconTest {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }

    private static void createAndShowGui() {
        String base = "http://download.oracle.com/"
            + "javase/tutorial/uiswing/examples/components/"
            + "RadioButtonDemoProject/src/components/images/";
        ImageIcon dog = null;
        ImageIcon pig = null;
        try {
            dog = new ImageIcon(new URL(base + "Dog.gif"));
            pig = new ImageIcon(new URL(base + "Pig.gif"));
        } catch (MalformedURLException ex) {
            ex.printStackTrace(System.err);
            return;
        }
        JFrame frame = new JFrame("Rollover Test");
        JPanel panel = new JPanel();
        panel.add(new JLabel(dog));
        panel.add(new JLabel(pig));

        JButton button = new JButton(dog);
        button.setRolloverIcon(pig);
        panel.add(button);

        frame.add(panel);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Anche se io non risponderò alla tua domanda particolare, spero che questo aiuta:

Se i componenti basta guardare sbagliato forse si dovrebbe riutilizzare componenti Swing e solo scrivere un look personalizzato & feel o tema.

Sarebbe certamente di aiuto per garantire l'aspetto dell'applicazione è coerente e almeno si utilizza lo strumento giusto per l'operazione che si vuole realizzare.

Come sidenote, essere consapevoli del fatto che Java è dotato di Look & sente multipla, tra cui Look & Si sente realizzato per imitare il tema nativo.

See: http://download.oracle.com/javase/ tutorial / uiswing / LookAndFeel / plaf.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top