gpt4 book ai didi

java - 如何使 JButtons 在以图像为背景的 JPanel 上可见

转载 作者:行者123 更新时间:2023-11-30 08:03:07 25 4
gpt4 key购买 nike

我制作了一个以图像作为背景的 JPanel。但是在第一次加载 JPanel 时,其余添加的组件但图像不可见。将鼠标悬停在图像上后,按钮就会变得可见。如何在加载面板时使 JButtons 与作为背景的图像一起可见。

enter image description here

这是我的代码片段:

    contentPane = new JPanel();
contentPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
setContentPane(contentPane);
contentPane.setLayout(null);

homePanel.setBounds(10, 11, 959, 620);
homePanel.setLayout(null);

JPanel wizardPanel = new JPanel();
wizardPanel.setBounds(10, 295, 545, 336);
wizardPanel.setLayout(null);
homePanel.add(wizardPanel);

JLabel backgroundLabel;
try {
backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(new File("images/nature.jpg"))));
backgroundLabel.setBounds(0, 0, 545, 336);
wizardPanel.add(backgroundLabel);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


JButton btnNewButton = new JButton("New button");
btnNewButton.setBounds(309, 95, 89, 23);
wizardPanel.add(btnNewButton);

JButton btnNewButton_1 = new JButton("New button");
btnNewButton_1.setBounds(309, 150, 89, 23);
wizardPanel.add(btnNewButton_1);

JButton btnNewButton_2 = new JButton("New button");
btnNewButton_2.setBounds(309, 212, 89, 23);
wizardPanel.add(btnNewButton_2);

最佳答案

把按钮放在标签上是个坏主意。更好的方法是将图像绘制为面板背景或使用 JLayer。这是第一个解决方案的示例:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import java.util.Objects;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class JImagePanel extends JPanel {

private final Image image;

private boolean scale;

public JImagePanel(Image anImage) {
image = Objects.requireNonNull(anImage);
}

public JImagePanel(Image anImage, LayoutManager aLayout) {
super(aLayout);
image = Objects.requireNonNull(anImage);
}

/**
* {@inheritDoc}
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final Image toDraw = scale? image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH) : image;
g.drawImage(toDraw, 0, 0, this);
}

/**
* {@inheritDoc}
*/
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
} else {
return new Dimension(image.getWidth(this), image.getHeight(this));
}
}

public boolean isScale() {
return scale;
}

public void setScale(boolean scale) {
this.scale = scale;
}


public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
try {
final JImagePanel p =
new JImagePanel(ImageIO.read(JImagePanel.class.getResource("myImage.png")), new FlowLayout());
p.setScale(true);
p.add(new JButton("Button"));
final JFrame frm = new JFrame("Image test");
frm.add(p);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

}

关于java - 如何使 JButtons 在以图像为背景的 JPanel 上可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36445244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com