2011-11-22 43 views
8

vì vậy tôi có JButtons này để thêm Biểu tượng. Các biểu tượng quá lớn ban đầu, vì vậy tôi thay đổi kích thước chúng trước, và nó hoạt động tốt. Ngoại trừ khi tôi thay đổi kích thước cửa sổ, kích thước thay đổi của JButtons, nhưng không phải là Biểu tượng, điều này có vấn đề.Biểu tượng JButton tự động thay đổi kích thước

Có cách nào để có Biểu tượng chỉ cần điền vào JButton được đính kèm không? Bit mã để làm cho nó rõ ràng hơn:

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 là một chức năng cá nhân, mà phải mất một biểu tượng, một tham số chiều rộng và một tham số chiều cao, và trả về một biểu tượng thay đổi kích cỡ (rõ ràng). Tôi đã thử thay đổi Bố cục, nhưng nó không thay đổi bất cứ điều gì. Tôi đã cố gắng nhận được chiều rộng/chiều cao của JButton, nhưng kể từ khi họ không tồn tại được nêu ra khi biểu tượng được thêm vào, nó không hoạt động.

Các bạn có biết cách vượt qua điều này không? Nó không phải là một biểu tượng, miễn là JButton của tôi được lấp đầy với hình ảnh tôi cho nó, nó tuyệt vời :)

Cảm ơn!

Trả lời

3

trong Swing bạn có thể thêm bất kỳ JComponent-JComponent các khác, ví ImageJLabel tốt nhất JComponent, thì tại sao không đặt JLabel#setIcon()-JButton

các 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); 
    } 
} 

EDIT:

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

Để có cách tiếp cận đơn giản hơn, hãy thay đổi thành 'int margin = 0; Dimension dim = this.getParent(). GetSize(); 'mà không cần phải ghi đè' getMinimumSize() 'và' getPreferredSize() 'vì thành phần cha có lề của nó đã được đặt là –

+0

Tuyệt vời! Vì vậy, nó hoạt động để vẽ một hình dạng, nhưng điều duy nhất là, một khi tôi thay thế 'g.setColor (Color.red); g.fillRect (lề, lề, dim.width - margin * 2, dim.height - margin * 2); ' bởi ' Biểu tượng biểu tượng = new ImageIcon ("src/triangle.jpg"); icon.paintIcon (điều này, g, 60, 60), ' , nó dừng hiển thị bất cứ điều gì cả. Bạn có biết tại sao điều này không? –

+0

@Mikalichov xin vui lòng xem sửa đổi của tôi – mKorbel

2

Bạn có thể thêm một Component-Listener để mà nút mà khi thay đổi kích thước thay đổi kích thước hình ảnh của bạn trong đó

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 
     } 
    }); 

Hy vọng nó sẽ giúp!

3
  1. Override paintComponent
  2. Draw the image trực tiếp đến nó Graphics đối tượng

Và khi vẽ hình ảnh, cung cấp các luận cứ chiều getWidth()getHeight(). Bằng cách này, việc thay đổi kích thước sẽ được tự động hóa. Ngoài ra, khi thay đổi kích thước, bạn sẽ muốn thực hiện một số tính năng chống răng cưa để hình ảnh không bị quá pixel.

Các vấn đề liên quan