2016-12-09 24 views
0

Also, das Problem, mit dem ich konfrontiert bin, ist, dass ich JButton's Bildmodell nehmen und es stattdessen als ein Bild verwenden möchte. Ich habe noch nie mit der Implementierung von Icons gearbeitet, also habe ich mich entschieden, etwas zu suchen. Ich konnte jedoch nichts finden, was sinnvoll wäre, was hier passiert.Verwenden Sie JButton als ein Bild

Ich habe den folgenden Code versucht:

JButton button = new JButton("Text"); 
JLabel buttonIcon = new JLabel(button.getIcon()); 

Allerdings, wenn ich die JLabel Anzeige zu gehen, erscheint nichts. Ist diese Interaktion falsch?

Ich wäre auch damit zufrieden, JButton's Model als Bildformat zu speichern und als solches zu importieren.

Jede Hilfe würde sehr geschätzt werden!

+0

Ich bin irgendwie verwirrt, was Sie erreichen wollen. Möchten Sie das 'Icon' eines' JButton' in einem 'JLabel' anzeigen? Oder möchten Sie ein Bild eines 'JButton' in einem' JLabel' anzeigen? Übrigens erweitert "JButton" 'JLabel' nicht, sodass' JLabel buttonIcon = new JButton (button.getIcon()); 'einen Fehler auslöst. –

+0

@LukasRotter Sorry, das war ein Tippfehler. Ich habe den Teil behoben, in dem ich versucht habe, JLabel auf einen JButton zu setzen. Ich möchte im Grunde das Aussehen der JButton haben, und erstellen Sie es als ein Objekt, mit dem nicht interagiert werden kann. Bearbeiten: Anzeigen der Jbutton Bild in einem JLabel – KyleKW

+1

Sie sollten in der Lage sein, die JButton auf ein Bild zu malen und setzen Sie das auf der JLabel. Eine andere Option wäre, die UI-Klasse von JLabel so zu ändern, dass das Bild auf die gleiche Weise wie auf der Schaltfläche gezeichnet wird. – Jayfray

Antwort

6

Wenn Sie also eine sichtbare Komponente Schnappschuss wollen und es sich in einer JLabel anzuzeigen, können Sie

  1. die es preferredSizesize auf die Schaltfläche Set.
  2. Erstellen Sie eine BufferedImage.
  3. Rufen Sie button.paint(image.createGraphics()) an, um den Knopf auf das Bild zu zeichnen.
  4. Setzen Sie die Icon der JLabel auf eine neue, die das Bild enthält.

Hier ist ein Beispiel (dank camickr die helped me den Prozess sauberer machen):

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Example { 

    public void createAndShowGUI() { 
     JButton button = new JButton("Text"); 
     button.setSize(button.getPreferredSize()); 

     JLabel label = new JLabel(); 
     label.setIcon(new ImageIcon(snapshot(button))); 

     JPanel contentPane = new JPanel(); 
     contentPane.add(label); 

     JFrame frame = new JFrame(); 
     frame.setContentPane(contentPane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private BufferedImage snapshot(Component component) { 
     BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), 
       BufferedImage.TYPE_INT_RGB); 
     component.paint(image.createGraphics()); 
     return image; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> new Example().createAndShowGUI()); 
    } 
} 
+4

(1+) aber um den Prozess ein wenig sauberer zu machen 1) gibt es keine Notwendigkeit, das Etikett neu zu streichen. Eine Swing-Komponente ruft 'revalidate()' und 'repaint()' auf sich selbst auf, wenn eine Eigenschaft geändert wird. 2) Sie müssen die Schaltfläche nicht zum Panel hinzufügen, um ein Bild davon zu erhalten. Sie müssen a) 'button.setSize (button.getPreferredSize()' 'verwenden und b) paintAll (...) in' paint (...) 'ändern. – camickr

+0

Das ist genau das, was ich brauchte. Vielen Dank Lukas und Camickr! – KyleKW

-1

Versuchen Sie, diese

File imgFile=new File("img.jpeg"); 
Image img=ImageIO.read(imgFile); 
ImageIcon icon=new ImageIcon(img); 
JButton button=new JButton(); 
JLabel label=new JLabel(); 
button.setIcon(icon); 
label.setIcon(button.getIcon()); 
+0

Ich habe das abgelehnt, weil das OP ein Bild der tatsächlichen Schaltfläche anzeigen möchte, nicht das Symbol der Schaltfläche. –

Verwandte Themen