web-dev-qa-db-ja.com

Javaを使用したSwing JButtonの丸め

まあ、私はボタン(または何か不快なもの)の背景として置きたい画像があります。問題は、この画像が丸いため、この画像を縁なしで表示する必要があるなどです。

このボタンを保持するJComponentにはカスタムの背景があるため、ボタンは実際には画像のみを表示する必要があります。

Googleを検索したところ、どうにかできませんでした。私は次のことをすべて試しましたが、うまくいきませんでした:

button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);

アイコンを背景にペイントした後、ボタンはそれをペイントしますが、境界線などの醜い灰色の背景を保持しています。また、JLabelとJButtonを使用しようとしました。そして、ImageIconをそこにペイントしますが、ユーザーがウィンドウのサイズを変更または最小化すると、アイコンが消えます!

どうすれば修正できますか?

画像をペイントしてJComponentに丸め、クリックをリッスンするだけです...

17
José Leal

新しいJbuttonを作成します。

    JButton addBtn = new JButton("+");
    addBtn.setBounds(x_pos, y_pos, 30, 25);
    addBtn.setBorder(new RoundedBorder(10)); //10 is the radius
    addBtn.setForeground(Color.BLUE);

jButtonの境界線を設定するときに、オーバーライドされたjavax.swing.border.Borderクラスを呼び出します。

addBtn.setBorder(new RoundedBorder(10));

これがクラスです

private static class RoundedBorder implements Border {

    private int radius;


    RoundedBorder(int radius) {
        this.radius = radius;
    }


    public Insets getBorderInsets(Component c) {
        return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius);
    }


    public boolean isBorderOpaque() {
        return true;
    }


    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        g.drawRoundRect(x, y, width-1, height-1, radius, radius);
    }
}
18
Lalchand

以下を試しましたか?

_button.setOpaque(false);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important
_

setBorder(null)は機能する可能性がありますが、 Sunで説明されているバグ があると説明しています。 UIResourceインターフェースを実装していません。

Nullが渡されたときにJDK自体がボーダーをEmptyBorderに設定するのではなく、クライアントがEmptyBorderを自分で設定する必要があります(非常に簡単な回避策)。そうすれば、コードでだれが何をしているのか混乱することはありません。

12
VonC

Paint(Graphics g)メソッドをオーバーライドすることをお勧めします。

class JImageButton extends JComponent implements MouseListener {
    private BufferedImage img = null;

    public JImageButton(BufferedImage img) {
        this.img = img;
        setMinimumSize(new Dimension(img.getWidth(), img.getHeight()));
        setOpaque(false);
        addMouseListener(this);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}
1
pek
  1. 通常のボタンをパネルにドラッグします

  2. ボタンを右クリックして、プロパティに移動します。

    boarder           = no barder
    boarder painted   = false
    contentAreaFilled = false
    focusPainted      = false
    opaque            = false
    
  3. プロジェクトにインポートして(アイコン)と(rolloverIcon)を設定します。

1
user1477929

以下を試すことができます。私には問題なく動作し、ボタンにも同じ問題が発生しました。

// Jbutton
JButton imageButton = new JButton();

// Buffered Icon
BufferedImage buttonIcon = null;

try {
    // Get the image and set it to the imageicon
    buttonIcon = ImageIO.read(getClass().getClassLoader().getResource("images/login.png"));
}
catch(Exception ex) {

}

// Set the image icon here
imageButton = new JButton(new ImageIcon(buttonIcon));
imageButton.setBorderPainted(false);
imageButton.setContentAreaFilled(false);
imageButton.setFocusPainted(false);
imageButton.setOpaque(false);
1
Luffy

不透明度はfalseに設定する必要があるため、

button.setOpaque(false);

すでにあなたが望むものである可能性があります。

0
Bombe

次のように、ボタンに空の境界線を作成できます。

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
0
Reeba Babu

私は OvalButton クラスを作成しました。これは、楕円形、円形、カプセルのような形のJButtonを処理できます。

あなたのケースでは、 OvalButton クラスを拡張し、getBackgroundImage()メソッドをオーバーライドして、背景として設定する画像を返します。次に、通常どおりにリスナーとテキストを追加します。楕円形/円形の領域をクリックするだけでアクションがトリガーされます。

ボタンクラスの例:

import Java.awt.image.BufferedImage;
import Java.io.File;
import Java.io.IOException;
import javax.imageio.ImageIO;

public class ImageButton extends OvalButton {

    private BufferedImage image;

    public ImageButton() {
        super(); // Default is oval/circle shape.

        setBorderThickness(0); // Oval buttons have some border by default.

        try {
            image = ImageIO.read(new File("your_image.jpg")); // Replace with the path to your image.
        } 
        catch (IOException e) {
            e.printStackTrace();
            image = null;
        }
    }

    @Override
    protected BufferedImage getBackgroundImage() {
        return image;
    }
}
0
Luka Kralj