我目前正在设计一个菜单,其中包含多个屏幕,每个屏幕上都有多个按钮。要在背景图像的顶部使用按钮,这是在jLabel中(默认情况下,我不能将按钮放在jLabel的TOP上),我使用GridBagLayout和两个面板/菜单屏幕,一个面板包含按钮(opaque = false)和一个带有背景图片的面板,或jLabel。为了切换当前显示的面板,根据用户在菜单中的位置,我用不同的方法制作每个菜单屏幕(也就是每两个面板),而不是类。
现在,我已经到了我正在处理不必要复杂的界面部分的地步,我觉得GridBag不会满足我的目的,所以我想知道是否有不同的方法绘制我的背景图像,仍然可以在图像上使用我的按钮。
我查找的最流行的方法是覆盖paintComponent方法,但我不能这样做,因为我已经在单独的方法中创建了JPanel,而不是类。它们都包含在我原来的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);
}
};
答案 0 :(得分:2)
使用Swing而不覆盖paintComponent的BG图像
我不知道为什么所有贴子都建议为此做自定义绘画。如果您需要自动缩放背景图像,则只能进行自定义绘画。
如果您想要以真实尺寸绘制图像,请使用JLabel。
我不能把按钮放在jLabel的TOP上,
当然可以。只需为JLabel设置LayoutManager,然后就可以像添加组件到面板一样添加任何组件。
答案 1 :(得分:1)
在上面的评论中,我说:
您总是可以创建一个匿名的内部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();
}
});
}
}