2016-12-09 31 views
0

因此,我面臨的問題是我想採用JButton的圖像模型,並將其用作圖像。我之前沒有在swing中實現過圖標,所以我決定做一些搜索。然而,我找不到任何有意義的東西在這裏發生。使用JButton作爲圖像

我試過下面的代碼:

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

然而,當我去顯示JLabel的,似乎什麼都沒有。這種交互是錯誤的嗎?

我也很滿意保存JButton的模型作爲圖像格式,並導入它。

任何幫助將不勝感激!

+0

我有點困惑你想要達到的目標。你想在'JLabel'裏面顯示'JButton'的'Icon'嗎?或者你想在'JLabel'中顯示一個'JButton'的圖像?順便說一句,'JButton'沒有擴展'JLabel',所以'JLabel buttonIcon = new JButton(button.getIcon());'會拋出一個錯誤。 –

+0

@LukasRotter對不起,這是一個錯字。我已經修復了我試圖將JLabel設置爲JButton的部分。 我基本上想要看看JButton的外觀,並將它創建爲一個無法與之交互的對象。 編輯:在JLabel中顯示Jbutton圖像 – KyleKW

+1

您應該能夠將JButton繪製爲圖像並將其設置在JLabel上。另一種選擇是更改JLabel的UI類,以便按照與按鈕上相同的方式結束繪製圖像。 – Jayfray

回答

6

所以,你可以

  1. 將按鈕的size到它的preferredSize
  2. 創建一個BufferedImage
  3. 致電button.paint(image.createGraphics())將按鈕拖到圖像上。
  4. JLabelIcon設置爲包含圖像的新圖像。

下面是一個例子(感謝camickr誰helped me使這個過程更清潔):

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+),但使過程更清潔1)不需要重新塗刷標籤。當一個屬性改變時,一個Swing組件會調用自己的'revalidate()'和'repaint()'。 2)不需要將該按鈕添加到面板以獲得它的圖像。您需要a)使用'button.setSize(button.getPreferredSize()'和b)將paintAll(...)更改爲'paint(...)'。 – camickr

+0

這完全是我所需要的。非常感謝Lukas和camickr! – KyleKW

-1

,如果你想進行快照的可視化組件,並顯示它裏面JLabel試試這個

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

我降低了這一點,因爲OP想要顯示實際按鈕的圖像,而不是按鈕的「圖標」。 –