2011-11-22 98 views
8

所以我有這JButtons我添加圖標。圖標太大,所以我事先調整它們,並且它工作正常。除了當我調整窗口大小時,JButtons會改變大小,但不會改變圖標,這是有問題的。自動調整JButton圖標

有沒有辦法讓一個Icon只填充它所連接的JButton?一些代碼,以使其更清晰:

public JewelClass(){ 

    setBackground (new Color (30,30,30)); 
    addActionListener(this); 
    setLayout(new GridLayout()); 

    ImageIcon icon = new ImageIcon(src/carre.jpg); 
    setIcon (resizeIcon(icon,60,60)); 

} 

resizeIcon是一個個人的功能,這需要一個圖標,寬度參數和高度參數,並返回一個調整大小圖標(顯然)。 我試着改變佈局,但它沒有改變任何東西。我嘗試獲取JButton的寬度/高度,但是因爲在添加圖標時它們不存在,所以它不起作用。

你們有什麼想法如何解決這個問題嗎?它不一定是一個圖標,只要我的JButton充滿了我給它的圖像,它真棒:)

謝謝!

回答

3
在Swing

您可以任意JComponent添加到另一個JComponent,爲ImageJLabel最好JComponent,那麼爲什麼不把JLabel#setIcon()JButton

enter image description hereenter image description here

import java.awt.*; 
import javax.swing.*; 

public class ResizeIconInButton extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public ResizeIconInButton() { 
     JButton myButton = new JButton(); 
     myButton.setLayout(new BorderLayout()); 
     myButton.add(new CustomComponents0()); 
     add(myButton, BorderLayout.CENTER); 
     setPreferredSize(getPreferredSize()); 
     setTitle("Resize Icon In Button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       ResizeIconInButton main = new ResizeIconInButton(); 

      } 
     }; 
     javax.swing.SwingUtilities.invokeLater(r); 
    } 
} 

class CustomComponents0 extends JLabel { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(200, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 200); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 

編輯:

import java.awt.*; 
import javax.swing.*; 

public class ResizeIconInButton extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg"; 
    private JButton myButton = new JButton(); 
    private JLabel myLabel = new JLabel(); 

    public ResizeIconInButton() { 
     Icon myIcon = new ImageIcon(IMAGE_PATH); 
     myLabel.setIcon(myIcon); 
     myButton.setLayout(new BorderLayout()); 
     myButton.add(myLabel); 
     add(myButton, BorderLayout.CENTER); 
     setPreferredSize(new Dimension(200, 100)); 
     setTitle("Resize Icon In Button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ResizeIconInButton main = new ResizeIconInButton(); 
      } 
     }); 
    } 
} 
+0

對於更簡單的方法,更改爲'int margin = 0; Dimension dim = this.getParent()。getSize();'因爲父組件的邊距已經設置,所以不需要重寫'getMinimumSize()'和'getPreferredSize()' –

+0

好極了!所以它可以繪製一個形狀,但唯一的是,一旦我替換成g.setColor(Color.red); g.fillRect(margin,margin,dim.width - margin * 2,dim.height - margin * 2);' 由 'Icon icon = new ImageIcon(「src/triangle.jpg」); icon.paintIcon(this,g,60,60);' ,它根本不顯示任何內容。 你知道這是爲什麼嗎? –

+0

@Mikalichov請參閱我的編輯 – mKorbel

2

你可以一個組件的偵聽器添加到按鈕,調整大小後重新調整你的形象在它

yourButton.addComponentListener(new ComponentListener() { 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // ignore 
     } 

     @Override 
     public void componentResized(ComponentEvent e) { 
      resizeIcon(icon, yourButton.getWidth(), yourButton.getHeight()); 
     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // ignore 
     } 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // ignore 
     } 
    }); 

希望它能幫助!

3
  1. 覆蓋paintComponent
  2. Draw the image直接到它的Graphics對象

並繪製圖像時,提供的尺寸參數getWidth()getHeight()。通過這樣做,調整大小將被自動化。此外,在調整大小時,您需要進行一些反鋸齒處理,以便圖像不會過於像素化。