2009-02-05 9 views
5

Wie kann ich in einer Swing-Oberfläche eine Umschalt-Schaltfläche erstellen? Ich habe zwei Bilder, imageon.jpg und imageoff.jpg, und ich möchte grundsätzlich ein anklickbares Element, das die Bilder umschaltet und ein Ereignis auslöst.Java: Bild als Umschaltfläche

Update: Gibt es eine Möglichkeit, die übliche "Chrom" um das Bild zu überschreiben? Ich würde ein einfaches Bild zu einem Knopf mit einem Bild nach innen bevorzugen.

Antwort

10

Laden Sie die Bilder mit ImageIcon. Erstellen Sie eine JToggleButton. Dann wenden Sie die Symbole mit AbstractButton.setIcon/setPressedIcon/setSelectedIcon an. Entfernen Sie den Rand mit AbstractButton.setBorderPainted(false).

+2

Mmm, vergaß über diese Methoden. (Und sie erscheinen nicht im Javadoc, es sei denn, Sie erinnern sich, dass sie existieren.) +1 –

+2

wirklich seltsam ... Ich habe auch versucht, die Grenze zu false zu machen, aber immer noch die Grenze auf dem Bild, noch den Schalter. Wie löse ich es aus? :( – gumuruh

3

Wie wäre es mit JToggleButton? Sie können sie unterklassifizieren und paint() überschreiben, um das richtige Bild basierend darauf zu erstellen, ob es ausgewählt ist oder nicht.

Eine andere Möglichkeit wäre, die Unterklasse JPanel abzufangen und Mausklicks zu fangen, indem man paintComponent() überschreibt, um das korrekte Bild zu zeichnen. Auf diese Weise wird nur das tatsächliche Bild gezeichnet (im Gegensatz zur Option JToggleButton).

+0

Danke für den JPanel Tipp! Ich fand diese Ressource, hoffe es lehrt mich zu bauen, was ich brauche: http://java.sun.com/docs/books/tutorial/uiswing/painting/index.html – Dan

1

Ihre beste Wette ist, Unterklasse AbstractButton, und legen Sie Eigenschaften wie Rahmen und Hintergrund (in Ihrem Konstruktor).

MyButton() { 
    setBorder(null); 
    setBackground(null); 
    } 
2

Ich hatte das gleiche Problem mit JButtons. Versuchen Sie dies:

result = new JButton(icon); 
result.setBorderPainted(false); 
result.setContentAreaFilled(false); 

width = icon.getIconWidth(); 
height = icon.getIconHeight(); 
result.setPreferredSize(new Dimension(width, height)); 

Es ist notwendig, die bevorzugte Größe zu setzen, um zusätzlichen Platz um die Schaltfläche loszuwerden. Dies funktionierte für mich unter Windows 7 und Mac OS X 10.6.