まあ、私はボタン(または何か不快なもの)の背景として置きたい画像があります。問題は、この画像が丸いため、この画像を縁なしで表示する必要があるなどです。
このボタンを保持するJComponentにはカスタムの背景があるため、ボタンは実際には画像のみを表示する必要があります。
Googleを検索したところ、どうにかできませんでした。私は次のことをすべて試しましたが、うまくいきませんでした:
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);
アイコンを背景にペイントした後、ボタンはそれをペイントしますが、境界線などの醜い灰色の背景を保持しています。また、JLabelとJButtonを使用しようとしました。そして、ImageIconをそこにペイントしますが、ユーザーがウィンドウのサイズを変更または最小化すると、アイコンが消えます!
どうすれば修正できますか?
画像をペイントしてJComponentに丸め、クリックをリッスンするだけです...
新しい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);
}
}
以下を試しましたか?
_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
を自分で設定する必要があります(非常に簡単な回避策)。そうすれば、コードでだれが何をしているのか混乱することはありません。
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) {
}
}
通常のボタンをパネルにドラッグします
ボタンを右クリックして、プロパティに移動します。
boarder = no barder
boarder painted = false
contentAreaFilled = false
focusPainted = false
opaque = false
プロジェクトにインポートして(アイコン)と(rolloverIcon)を設定します。
以下を試すことができます。私には問題なく動作し、ボタンにも同じ問題が発生しました。
// 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);
不透明度はfalseに設定する必要があるため、
button.setOpaque(false);
すでにあなたが望むものである可能性があります。
次のように、ボタンに空の境界線を作成できます。
button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
私は 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;
}
}