我目前正在设计一个带有多个屏幕的菜单,每个屏幕上都有多个按钮。要在jLabel中的背景图片上方使用按钮(默认情况下,我不能将按钮放在jLabel的TOP上),我使用了GridBagLayout带有两个面板/菜单屏幕,其中一个面板包含按钮(不透明= false)和一个带有背景图片的面板或jLabel。为了切换当前显示的面板,具体取决于用户在菜单中的位置,我使用单独的方法(而不是类)制作了每个菜单屏幕(也就是每2个面板)。
现在,我到了要处理不必要地复杂的界面部分的地步,我不觉得GridBag可以满足我的目的,所以我想知道是否有另一种方式来绘制背景图片,仍然可以使用图片顶部的按钮。
我查找的最流行的方法是重写paintComponent方法,但是我不能这样做,因为我已经在单独的方法(而不是类)中创建了JPanels。它们全部包含在我的原始JFrame中。
帮助将不胜感激,谢谢!
刚刚添加了这段代码,但是由于某种原因我的背景仍然是白色的吗?谢谢大家,现在就尝试其他建议!
private void mainPanel() {
icon = new ImageIcon(getClass().getResource("/phantasma/menuv1.png"));
mainContainer1 = new javax.swing.JPanel() {
@Override
protected void paintComponent(Graphics g) {
g.drawImage(icon.getImage(), 0,0, null);
super.paintComponent(g);
}
};
最佳答案
在上面的评论中,我声明:
您始终可以创建一个内部JPanel派生的匿名类,并在需要时重写paintComponent方法。
作为我的意思的示例,您可以在您创建的任何JPanel中覆盖paintComponent,无论它是从独立类派生的还是在方法中创建的。例如
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
public class AnonInnerPanel {
private static void createAndShowGui() {
JPanel mainPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
};
JFrame frame = new JFrame("AnonInnerPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
关于java - 带有Swing且未覆盖paintComponent的BG图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7542124/