8

だから私はアイコンを追加するこのJButtonを持っています。アイコンは最初は大きすぎるので、事前にサイズを変更しておけば問題ありません。ただし、ウィンドウのサイズを変更すると、JButtonのサイズは変更されますが、アイコンは変更されません。これは問題があります。

アイコンをアタッチされている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が私が与える画像で満たされている限り、それはアイコンである必要はありません、それは素晴らしいです:)

ありがとう!

4

3 に答える 3

3

Swingでは、任意JComponentのものを別のものに追加できます。これが最高です。JComponentImageJLabelJComponentJLabel#setIcon()JButton

ここに画像の説明を入力してください ここに画像の説明を入力してください

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();
            }
        });
    }
}
于 2011-11-22T22:49:00.017 に答える
3
  1. オーバーライドpaintComponent
  2. Graphicsオブジェクトに直接画像を描画します

また、画像を描画するときは、次元の引数getWidth()とを指定しgetHeight()ます。これにより、サイズ変更が自動化されます。また、サイズを変更するときは、画像がピクセル化されすぎないように、アンチエイリアシングを実行する必要があります。

于 2011-11-22T23:07:25.610 に答える
2

そのボタンにComponent-Listenerを追加して、サイズを変更すると、そのボタン内の画像のサイズを変更できます。

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

それが役に立てば幸い!

于 2011-11-22T23:00:40.360 に答える