给JFrame加入背景图和组件,为保证组件出现在背景图上方(可见),重写paint方法,先
绘制背景图,再调用各组件的构造方法。
但是在菜单项切换时遇到了问题。
如果先点击一个菜单JMenu,然后将鼠标(或用键盘左右键)移到另一个JMenu上时,无法重绘背景图代码如下(组件只保留了菜单, 背景图片为1.jpg)
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;public class Test extends JFrame
{
JMenuBar gameMenu;
JMenu game;
JMenu help;
public Test()
{
gameMenu = new JMenuBar();
game = new JMenu("游戏");
help = new JMenu("帮助");

game.add(new JMenuItem("1"));
game.add(new JMenuItem("2"));

help.add(new JMenuItem("3"));
help.add(new JMenuItem("4"));

setJMenuBar(gameMenu);
gameMenu.add(game);
gameMenu.add(help);

MyListener ml = new MyListener();
game.addMenuListener(ml);
help.addMenuListener(ml);

setPreferredSize(new Dimension(400, 200));
pack();
setVisible(true);
}

public void paint(Graphics g)
{
g.drawImage(getToolkit().getImage("1.jpg"), 0, 0, getSize().width, getSize().height, this);
gameMenu.repaint();
}

public static void main(String[] args)
{
new Test();
}

private class MyListener implements MenuListener
  {
   private boolean gameClick;
   private boolean helpClick;
   public void menuCanceled(MenuEvent e) 
{
}

public void menuDeselected(MenuEvent e) 
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = false;
}
else
{
helpClick = false;
}
//repaint();
gameMenu.repaint();
}

public void menuSelected(MenuEvent e) 
{
if (((JMenu)e.getSource()).equals(game))
{
gameClick = true;
game.requestFocusInWindow();
game.doClick();
game.doClick();
}
else
{
helpClick = true;
help.doClick();
help.doClick();
help.requestFocusInWindow();
}
}
  }
}

解决方案 »

  1.   

    给JPanel加背景,Jpanel是轻量级的,可以在menu之下
    package testGUI;import java.awt.*;import javax.swing.*;
    import javax.swing.event.*;public class Test extends JFrame {
    JMenuBar gameMenu;
    JMenu game;
    JMenu help; public Test() {
    gameMenu = new JMenuBar();
    game = new JMenu("游戏");
    help = new JMenu("帮助"); game.add(new JMenuItem("1"));
    game.add(new JMenuItem("2")); help.add(new JMenuItem("3"));
    help.add(new JMenuItem("4")); setJMenuBar(gameMenu);
    gameMenu.add(game);
    gameMenu.add(help); MyListener ml = new MyListener();
    game.addMenuListener(ml);
    help.addMenuListener(ml); this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
    setSize(new Dimension(300,300));
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } private JPanel getCenterPanel() {
    JPanel panel = new JPanel() {
    private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g) {
    g.drawImage(getToolkit().getImage("D:\\1.jpg"), 0,
    0, getSize().width, getSize().height, this);
    super.paintComponent(g);
    }
    };
    panel.setOpaque(false);
    return panel;
    } public static void main(String[] args) {
    new Test();
    } private class MyListener implements MenuListener {
    private boolean gameClick;
    private boolean helpClick; public void menuCanceled(MenuEvent e) {
    } public void menuDeselected(MenuEvent e) {
    if (((JMenu) e.getSource()).equals(game)) {
    gameClick = false;
    } else {
    helpClick = false;
    }
    } public void menuSelected(MenuEvent e) {
    if (((JMenu) e.getSource()).equals(game)) {
    gameClick = true;
    game.requestFocusInWindow();
    game.doClick();
    game.doClick();
    } else {
    helpClick = true;
    help.doClick();
    help.doClick();
    help.requestFocusInWindow();
    }
    }
    }
    }
      

  2.   

    谢谢,不过还是有个问题,当菜单项足够多,菜单区域与JPanel部分重合时,组件消失了,只能看到背景图
      

  3.   

    菜单区域与JPanel部分重合时?这是什么情况,帖出来看看
      

  4.   

    当JMenuItem较多时,JMenu点开所占的区域与组件(如JButton)部分重合,
    仅可见菜单和背景图组件消失
    如下例,一个JMenu中的JMenuItem数量超过2就会出现上述情况。import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;public class Test extends JFrame
    {
    JMenuBar gameMenu;
    JPanel gamePanel;
    JButton b = new JButton("test");
    public Test()
    {
    gameMenu = new JMenuBar();
    JMenu game = new JMenu("游戏");
    JMenu help = new JMenu("帮助");

    game.add(new JMenuItem("1"));
    game.add(new JMenuItem("2"));

    help.add(new JMenuItem("3"));
    help.add(new JMenuItem("4"));
    help.add(new JMenuItem("5"));//////////////////////////

    setJMenuBar(gameMenu);
    gameMenu.add(game);
    gameMenu.add(help);

    gamePanel = new JPanel()
        {
        private static final long serialVersionUID = 1234567890123456789L;
      public void paint(Graphics g)
      {
       g.drawImage(getToolkit().getImage("1.jpg"), 0, 0, getSize().width, getSize().height, this);
       gameMenu.repaint();
       b.repaint();
      }
        };

    gamePanel.setLayout(new BorderLayout(10, 10));
    gamePanel.setPreferredSize(new Dimension(400, 200));
    gamePanel.add(b);
    gamePanel.add(new MyPanel(), BorderLayout.EAST);
    gamePanel.add(new MyPanel(), BorderLayout.WEST);
    gamePanel.add(new MyPanel(), BorderLayout.SOUTH);
    gamePanel.add(new MyPanel(), BorderLayout.NORTH);

    getContentPane().add(gamePanel);
    pack();
    setVisible(true);
    }

    class MyPanel extends JPanel
    {
    public MyPanel()
    {
    setPreferredSize(new Dimension(40, 40));
    setBackground(Color.BLUE);
         setOpaque(false);
    }
    }

    public static void main(String[] args)
    {
    new Test();
    }
    }
      

  5.   

    你的图层画的有问题package testGUI;import java.awt.*;import javax.swing.*;
    import javax.swing.event.*;public class Test extends JFrame {
    JMenuBar gameMenu;
    JMenu game;
    JMenu help;
        JButton b = new JButton("test");
    public Test() {
    gameMenu = new JMenuBar();
    game = new JMenu("游戏");
    help = new JMenu("帮助"); game.add(new JMenuItem("1"));
    game.add(new JMenuItem("2")); help.add(new JMenuItem("3"));
    help.add(new JMenuItem("4")); setJMenuBar(gameMenu);
    gameMenu.add(game);
    gameMenu.add(help); MyListener ml = new MyListener();
    game.addMenuListener(ml);
    help.addMenuListener(ml); this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
    setSize(new Dimension(300,300));
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } private JPanel getCenterPanel() {
    JPanel panel = new JPanel() {
    private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g) {
    g.drawImage(getToolkit().getImage("1.jpg"), 0,
    0, getSize().width, getSize().height, this);
    super.paintComponent(g);
    }
    };
    panel.setOpaque(false);
    b.setPreferredSize(new Dimension(300,200));
    panel.add(b);
    return panel;
    } public static void main(String[] args) {
    new Test();
    } private class MyListener implements MenuListener {
    private boolean gameClick;
    private boolean helpClick; public void menuCanceled(MenuEvent e) {
    } public void menuDeselected(MenuEvent e) {
    if (((JMenu) e.getSource()).equals(game)) {
    gameClick = false;
    } else {
    helpClick = false;
    }
    } public void menuSelected(MenuEvent e) {
    if (((JMenu) e.getSource()).equals(game)) {
    gameClick = true;
    game.requestFocusInWindow();
    game.doClick();
    game.doClick();
    } else {
    helpClick = true;
    help.doClick();
    help.doClick();
    help.requestFocusInWindow();
    }
    }
    }
    }