如何保持 JButton 的透明度 (java)
how to maintain transparency for JButtons (java)
我正在制作一款坦克游戏。在我的菜单中,我想将图片用作 jbutton,它们是部分透明的,当它们出现在屏幕上时,透明部分变为白色。
我尝试使用 .setOpaque
但这不起作用。我想不出任何其他方法来摆脱白色部分。我一直在寻找堆栈溢出,但 none 的方法似乎有所帮助。谁有想法?
谢谢!
package menu;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class MenuPanel extends JPanel implements ActionListener
{
private Button playKnop, highScoreKnop, quitKnop, HTPKnop;
private JTextField naam;
private Image achtergrond;
private Tanks mainVenster;
public static String naam_input;
int x = 95, width = 200, height = 50;
public MenuPanel(Tanks mainVenster)
{
this.mainVenster = mainVenster;
this.setLayout(null);
playKnop = new Button("/buttons/PLAY.png", 350, this);
highScoreKnop = new Button("/buttons/HS.png", 460, this);
HTPKnop = new Button("/buttons/HTP.png", 515, this);
quitKnop = new Button("/buttons/QUIT.png", 570, this);
this.add(playKnop);
this.add(quitKnop);
this.add(HTPKnop);
this.add(highScoreKnop);
validate();
}
public class Button extends JButton
{
JButton button;
ImageIcon buttonImage;
String backgroundPath;
int y;
public Button(String backgroundPath, int y, MenuPanel menuPanel)
{
super();
this.backgroundPath = backgroundPath;
this.y = y;
buttonImage = new
ImageIcon(PlayPanel.class.getResource(backgroundPath));
this.setIcon(buttonImage);
this.setBounds(x, y, width, height);;
this.addActionListener(menuPanel);
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(achtergrond, 0, 0, this.getWidth(), this.getHeight(),
this);
}
}
删除 JButton
的一些默认渲染属性,包括
contentAreaFilled
borderPainted
focusPainted
这会将按钮减少到什么都没有。 JButton
已经支持绘制图标(并且可以为真实的状态这样做),所以应该没有必要重写它的 paintComponent
方法...
public class TestPane extends JPanel {
public TestPane() {
setBackground(Color.RED);
setLayout(new GridBagLayout());
try {
BufferedImage img = ImageIO.read(getClass().getResource("/1xaN3.png"));
JButton btn = new JButton(new ImageIcon(img));
btn.setOpaque(false);
btn.setContentAreaFilled(false);
btn.setBorderPainted(false);
btn.setFocusPainted(false);
add(btn);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
就我个人而言,我更喜欢使用 ImageIO
而不是 ImageIcon
(或其他方法)加载我的图像,主要是因为如果出现问题它会抛出 IOException
(而不是默默地失败)并且不会 return 直到图像被加载(如果你做对了支持进度反馈)
查看 Reading/Loading an Image 了解更多详情
我正在制作一款坦克游戏。在我的菜单中,我想将图片用作 jbutton,它们是部分透明的,当它们出现在屏幕上时,透明部分变为白色。
.setOpaque
但这不起作用。我想不出任何其他方法来摆脱白色部分。我一直在寻找堆栈溢出,但 none 的方法似乎有所帮助。谁有想法?
谢谢!
package menu;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class MenuPanel extends JPanel implements ActionListener
{
private Button playKnop, highScoreKnop, quitKnop, HTPKnop;
private JTextField naam;
private Image achtergrond;
private Tanks mainVenster;
public static String naam_input;
int x = 95, width = 200, height = 50;
public MenuPanel(Tanks mainVenster)
{
this.mainVenster = mainVenster;
this.setLayout(null);
playKnop = new Button("/buttons/PLAY.png", 350, this);
highScoreKnop = new Button("/buttons/HS.png", 460, this);
HTPKnop = new Button("/buttons/HTP.png", 515, this);
quitKnop = new Button("/buttons/QUIT.png", 570, this);
this.add(playKnop);
this.add(quitKnop);
this.add(HTPKnop);
this.add(highScoreKnop);
validate();
}
public class Button extends JButton
{
JButton button;
ImageIcon buttonImage;
String backgroundPath;
int y;
public Button(String backgroundPath, int y, MenuPanel menuPanel)
{
super();
this.backgroundPath = backgroundPath;
this.y = y;
buttonImage = new
ImageIcon(PlayPanel.class.getResource(backgroundPath));
this.setIcon(buttonImage);
this.setBounds(x, y, width, height);;
this.addActionListener(menuPanel);
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(achtergrond, 0, 0, this.getWidth(), this.getHeight(),
this);
}
}
删除 JButton
的一些默认渲染属性,包括
contentAreaFilled
borderPainted
focusPainted
这会将按钮减少到什么都没有。 JButton
已经支持绘制图标(并且可以为真实的状态这样做),所以应该没有必要重写它的 paintComponent
方法...
public class TestPane extends JPanel {
public TestPane() {
setBackground(Color.RED);
setLayout(new GridBagLayout());
try {
BufferedImage img = ImageIO.read(getClass().getResource("/1xaN3.png"));
JButton btn = new JButton(new ImageIcon(img));
btn.setOpaque(false);
btn.setContentAreaFilled(false);
btn.setBorderPainted(false);
btn.setFocusPainted(false);
add(btn);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
就我个人而言,我更喜欢使用 ImageIO
而不是 ImageIcon
(或其他方法)加载我的图像,主要是因为如果出现问题它会抛出 IOException
(而不是默默地失败)并且不会 return 直到图像被加载(如果你做对了支持进度反馈)
查看 Reading/Loading an Image 了解更多详情