我把 Menu 加在 NORTH 位置和用 setJMenuBar 两种方式都试过没有发现你说的问题
估计是你用了 awt 里的 Penel 或者 MenuBar 其它组件。
package jamesfancy;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;public class Test {    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("Test");
        menubar.add(menu);
        
        menu.add(new JMenuItem("Test1"));
        menu.add(new JMenuItem("Test2"));
        menu.add(new JMenuItem("Test3"));
        menu.add(new JMenuItem("Test4"));
        
        frame.setJMenuBar(menubar);
        //frame.getContentPane().add(menubar, BorderLayout.NORTH);
        JPanel westPanel = new JPanel();
        westPanel.setPreferredSize(new Dimension(30, 30));
        westPanel.setBackground(Color.BLUE);
        frame.getContentPane().add(westPanel, BorderLayout.WEST);
        frame.getContentPane().add(new JPanel());
        
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}

解决方案 »

  1.   

    顺便说一下,JMenu 一定要放在 JMenuBar 中再把 JMenuBar 放在 JFrame 中,不然会出问题。
      

  2.   

    我的JMenu就是放在JMenuBar中的,真的很奇怪,你给的这个例子没有问题,我把代码贴上来你看看:
    /*
     * 创建日期 2004-11-2
     *
     * TODO 要更改此生成的文件的模板,请转至
     * 窗口 - 首选项 - Java - 代码样式 - 代码模板
     */
    package Draw;
    import java.awt.*;
    import javax.swing.*;
    import com.sun.image.codec.jpeg.*;
    import java.awt.GridLayout;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    /**
     * @author Administrator
     *
     * TODO 要更改此生成的类型注释的模板,请转至
     * 窗口 - 首选项 - Java - 代码样式 - 代码模板
     */
    public class MyDraw extends Canvas implements MouseMotionListener,MouseListener,ActionListener
    {
    int x = -1,y = -1,rubberInfo = 0,clearInfo = 0;
    Vector v=null;int n=1;
    Graphics2D  ggg ;
    BufferedImage image;
    Color DrawPenColor = new Color(0,0,0);
    private JPanel jContentPane = null;
    private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="7,7"
    private JMenuBar jJMenuBar = null;
    private JMenu File = null;
    private JMenuItem New = null;
    private JMenuItem Open = null;
    private JMenuItem Save = null;
    private JMenuItem Exit = null;
    private JMenu Edit = null;
    private JMenuItem GetScreen = null;
    private JMenu Color = null;
    private JMenuItem ColorPalette = null;
    private JMenu Help = null;
    private JMenuItem AboutMyDraw = null;
    private JPanel jPanel = null;
    private JButton GetScreen1 = null;
    private JButton Clear = null;
    private JButton Rubber = null;
    private JButton DrawPen = null;
    private JPanel jPanel1 = null;
    class Point
    {
    int x ,y;
    Point(int x,int y)
    {
    this.x = x;
    this.y = y;
    }
    }
    public MyDraw(){
    getJFrame();
    addMouseMotionListener(this); 
        addMouseListener(this);
        v = new Vector();
        
        image=new BufferedImage(400,400,BufferedImage.TYPE_INT_RGB);
        
        ggg=image.createGraphics();                              
        Rectangle2D rect=new Rectangle2D.Double(0,0,400,400);      
        ggg.setColor(getBackground());
        ggg.fill(rect);
    }
    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */    
    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJPanel(), java.awt.BorderLayout.WEST);
    jContentPane.add(getJPanel1(), java.awt.BorderLayout.CENTER);
    }
    return jContentPane;
    }
    /**
     * This method initializes jFrame
     * 
     * @return javax.swing.JFrame
     */    
    private JFrame getJFrame() {
    if (jFrame == null) {
    jFrame = new JFrame();
    jFrame.setContentPane(getJContentPane());
    jFrame.setTitle("jFrame");
    jFrame.setSize(407, 319);
    jFrame.setJMenuBar(getJJMenuBar());
        jFrame.setBounds(100, 80, 450, 440);
       
        jFrame.validate();
        jFrame.setVisible(true);
        jFrame.setBackground(java.awt.Color.gray);
       
        jFrame.pack();
    }
    return jFrame;
    }
    /**
     * This method initializes jJMenuBar
     * 
     * @return javax.swing.JMenuBar
     */    
    private JMenuBar getJJMenuBar() {
    if (jJMenuBar == null) {
    jJMenuBar = new JMenuBar();
    jJMenuBar.add(getFile());
    jJMenuBar.add(getEdit());
    jJMenuBar.add(getColor());
    jJMenuBar.add(getHelp());
    }
    return jJMenuBar;
    }
    /**
     * This method initializes File
     * 
     * @return javax.swing.JMenu
     */    
    private JMenu getFile() {
    if (File == null) {
    File = new JMenu("File");
    File.add(getNew());
    File.add(getOpen());
    File.add(getSave());
    File.add(getExit());
    }
    return File;
    }
    /**
     * This method initializes New
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getNew() {
    if (New == null) {
    New = new JMenuItem();
    New.setText("New");
    New.addActionListener(this);
    }
    return New;
    }
    /**
     * This method initializes Open
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getOpen() {
    if (Open == null) {
    Open = new JMenuItem();
    Open.setText("Open");
    Open.addActionListener(this);
    }
    return Open;
    }
    /**
     * This method initializes Save
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getSave() {
    if (Save == null) {
    Save = new JMenuItem();
    Save.setText("Save");
    Save.addActionListener(this);
    }
    return Save;
    }
    /**
     * This method initializes Exit
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getExit() {
    if (Exit == null) {
    Exit = new JMenuItem();
    Exit.setText("Exit");
    Exit.addActionListener(this);
    }
    return Exit;
    }
    /**
     * This method initializes Edit
     * 
     * @return javax.swing.JMenu
     */    
    private JMenu getEdit() {
    if (Edit == null) {
    Edit = new JMenu("Edit");
    Edit.add(getGetScreen());
    }
    return Edit;
    }
    /**
     * This method initializes GetScreen
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getGetScreen() {
    if (GetScreen == null) {
    GetScreen = new JMenuItem();
    GetScreen.setText("GetSceen");
    GetScreen.addActionListener(this);
    }
    return GetScreen;
    }
    /**
     * This method initializes Color
     * 
     * @return javax.swing.JMenu
     */    
    private JMenu getColor() {
    if (Color == null) {
    Color = new JMenu("Color");
    Color.add(getColorPalette());
    }
    return Color;
    }
    /**
     * This method initializes ColorPalette
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getColorPalette() {
    if (ColorPalette == null) {
    ColorPalette = new JMenuItem();
    ColorPalette.setText("ColorPalette");
    ColorPalette.addActionListener(this);
    }
    return ColorPalette;
    }
    /**
     * This method initializes Help
     * 
     * @return javax.swing.JMenu
     */    
    private JMenu getHelp() {
    if (Help == null) {
    Help = new JMenu("Help");
    Help.add(getAboutMyDraw());
    }
    return Help;
    }
    /**
     * This method initializes AboutMyDraw
     * 
     * @return javax.swing.JMenuItem
     */    
    private JMenuItem getAboutMyDraw() {
    if (AboutMyDraw == null) {
    AboutMyDraw = new JMenuItem();
    AboutMyDraw.setText("About MyDraw");
    AboutMyDraw.addActionListener(this);
    }
    return AboutMyDraw;
    }
      

  3.   

    /**
     * This method initializes jPanel
     * 
     * @return javax.swing.JPanel
     */    
    private JPanel getJPanel() {
    if (jPanel == null) {
    GridLayout gridLayout1 = new GridLayout();
    jPanel = new JPanel();
    jPanel.setLayout(gridLayout1);
    jPanel.setPreferredSize(new java.awt.Dimension(100,70));
    gridLayout1.setRows(8);
    jPanel.add(getDrawPen(), null);
    jPanel.add(getRubber(), null);
    jPanel.add(getClear(), null);
    jPanel.add(getGetScreen1(), null);
    }
    return jPanel;
    }
    /**
     * This method initializes GetScreen1
     * 
     * @return javax.swing.JButton
     */    
    private JButton getGetScreen1() {
    if (GetScreen1 == null) {
    GetScreen1 = new JButton();
    GetScreen1.setText("GetScreen");
    GetScreen1.addActionListener(this);
    }
    return GetScreen1;
    }
    /**
     * This method initializes Clear
     * 
     * @return javax.swing.JButton
     */    
    private JButton getClear() {
    if (Clear == null) {
    Clear = new JButton();
    Clear.setText("Clear");
    Clear.addActionListener(this);
    }
    return Clear;
    }
    /**
     * This method initializes Rubber
     * 
     * @return javax.swing.JButton
     */    
    private JButton getRubber() {
    if (Rubber == null) {
    Rubber = new JButton();
    Rubber.setText("Rubber");
    Rubber.addActionListener(this);
    }
    return Rubber;
    }
    /**
     * This method initializes DrawPen
     * 
     * @return javax.swing.JButton
     */    
    private JButton getDrawPen() {
    if (DrawPen == null) {
    DrawPen = new JButton();
    DrawPen.setText("DrawPen");
    DrawPen.addActionListener(this);
    }
    return DrawPen;
    }
    public void paint(Graphics g)
    {
    if(x!=-1&&y!=-1&&rubberInfo==0&&clearInfo==0)
    {
    g.setColor(DrawPenColor);
    n = v.size();
    for(int i=0;i<n-1;i++)
    {
    Point p1 = (Point)v.elementAt(i);
    Point p2 = (Point)v.elementAt(i+1);
    g.drawLine(p1.x,p1.y,p2.x,p2.y);
    ggg.setColor(g.getColor());
    ggg.drawLine(p1.x,p1.y,p2.x,p2.y);
    }
    }
    else if(rubberInfo==1&&clearInfo==0)
    {
    g.setColor(getBackground());
    g.fillRect(x-2,y-2,10,10);
    ggg.setColor(getBackground());
    ggg.fillRect(x-2,y-2,10,10);
    }
    else if(clearInfo==1&&rubberInfo==0)
    {
    g.setColor(getBackground());
    g.fillRect(0,0,400,400);
    ggg.setColor(getBackground());
    ggg.fillRect(0,0,400,400);
    }
    g.drawImage(image,0,0,400,400,this);
    }
    public void mouseDragged(MouseEvent e)
    {
    x = (int)e.getX();
    y = (int)e.getY();
    Point p = new Point(x,y);
    v.addElement(p);
    repaint();
    }
    public void mouseMoved(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e)
    {
    v.removeAllElements();
    }
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}
    public void update(Graphics g)
    {
    {
    paint(g);
    }
    }
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource()==Clear)
    {
    clearInfo=1;
    rubberInfo=0;
    repaint();
    }
    else if(e.getSource()==Rubber)
    {
    rubberInfo=1;
    clearInfo=0;
    }
    else if(e.getSource()==GetScreen1 ||e.getSource()==GetScreen)
    {
    Robot robot = null;
    try
    {
    robot = new Robot();
    }catch(Exception er){}
    Rectangle screenRect = null;
    int width = getToolkit().getScreenSize().width;
    int height = getToolkit().getScreenSize().height;
    screenRect = new Rectangle(0,0,width,height);

    this.setVisible(false);
    this.setVisible(false);
    image = robot.createScreenCapture(screenRect);
    this.setVisible(true);
    repaint();
    }
    else if(e.getSource()==DrawPen)
    {
    rubberInfo = 0;
    clearInfo = 0;
    }
    else if(e.getSource()==New)
    {
    jFrame.dispose();
    this.jFrame.dispose();
    MyDraw canvas = new MyDraw();
    }
    // else if(e.getSource()==Open)
    // {
    //
    // }
    else if(e.getSource()==Save)
    {
    FileDialog savedialog = new FileDialog(jFrame,"Save As.JPEG",FileDialog.SAVE);
    savedialog.setVisible(true);
    if(savedialog.getFile()!=null)
    {
    try
    {
    String fileName = savedialog.getFile();
    FileOutputStream out = new FileOutputStream(fileName);
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
    param.setQuality(1.0f,false);
    encoder.setJPEGEncodeParam(param);
    encoder.encode(image);
    out.close();
    }catch(IOException EE){EE.printStackTrace();}
    }
    }
    // else if(e.getSource()==Exit)
    // {
    //
    // }
    else if(e.getSource()==ColorPalette)
    {
    Color tempColor = JColorChooser.showDialog(this,"ColorPalette",DrawPenColor);
    {
    if(tempColor != null)
    {
    DrawPenColor = tempColor;
    DrawPen.setForeground(DrawPenColor);
    }
    }
    }
    }
    /**
     * This method initializes jPanel1
     * 
     * @return javax.swing.JPanel
     */    
    private JPanel getJPanel1() {
    if (jPanel1 == null) {
    jPanel1 = new JPanel();
    jPanel1.setLayout(new BorderLayout());
    jPanel1.add(this);

    jPanel1.setBounds(100,80,250,250);
    jPanel1.setBackground(java.awt.Color.white);
    }
    return jPanel1;
    }
      public static void main(String[] args)
    {
    MyDraw md = new MyDraw();
    }
    }
      

  4.   

    不好意思,贴的代码太长了,我精练了一下,麻烦你看一下问题到底出在哪里!
    package Draw;
    import java.awt.*;
    import javax.swing.*;
    import com.sun.image.codec.jpeg.*;
    import java.awt.GridLayout;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;public class MyDraw1 extends Canvas
    {

    private JPanel jContentPane = null;
    private JFrame jFrame = null;  
    private JMenuBar jJMenuBar = null;
    private JMenu File = null;
    private JMenuItem New = null;
    private JMenuItem Exit = null;
    private JMenu Edit = null;
    private JMenuItem GetScreen = null;
    private JMenu Color = null;
    private JMenuItem ColorPalette = null;
    private JMenu Help = null;
    private JMenuItem AboutMyDraw = null;
    private JPanel jPanel = null;
    private JButton DrawPen = null;
    private JPanel jPanel1 = null;
    public MyDraw1(){
    getJFrame();
    }

     
    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJPanel(), java.awt.BorderLayout.WEST);
    jContentPane.add(getJPanel1(), java.awt.BorderLayout.CENTER);
    }
    return jContentPane;
    }
     
    private JFrame getJFrame() {
    if (jFrame == null) {
    jFrame = new JFrame();
    jFrame.setContentPane(getJContentPane());
    jFrame.setTitle("jFrame");
    jFrame.setSize(407, 319);
    jFrame.setJMenuBar(getJJMenuBar());
        jFrame.setBounds(100, 80, 450, 440);
       
        jFrame.validate();
        jFrame.setVisible(true);
        jFrame.setBackground(java.awt.Color.gray);
       
        jFrame.pack();
    }
    return jFrame;
    }


    private JMenuBar getJJMenuBar() {
    if (jJMenuBar == null) {
    jJMenuBar = new JMenuBar();
    jJMenuBar.add(getFile());
    jJMenuBar.add(getEdit());
    jJMenuBar.add(getColor());
    jJMenuBar.add(getHelp());
    }
    return jJMenuBar;
    }

    private JMenu getFile() {
    if (File == null) {
    File = new JMenu("File");
    File.add(getNew());
    File.add(getExit());
    }
    return File;
    }
     
    private JMenuItem getNew() {
    if (New == null) {
    New = new JMenuItem();
    New.setText("New");

    }
    return New;
    }


    private JMenuItem getExit() {
    if (Exit == null) {
    Exit = new JMenuItem();
    Exit.setText("Exit");

    }
    return Exit;
    }

    private JMenu getEdit() {
    if (Edit == null) {
    Edit = new JMenu("Edit");
    Edit.add(getGetScreen());
    }
    return Edit;
    }
     
    private JMenuItem getGetScreen() {
    if (GetScreen == null) {
    GetScreen = new JMenuItem();
    GetScreen.setText("GetSceen");

    }
    return GetScreen;
    }

    private JMenu getColor() {
    if (Color == null) {
    Color = new JMenu("Color");
    Color.add(getColorPalette());
    }
    return Color;
    }
     
    private JMenuItem getColorPalette() {
    if (ColorPalette == null) {
    ColorPalette = new JMenuItem();
    ColorPalette.setText("ColorPalette");

    }
    return ColorPalette;
    }

    private JMenu getHelp() {
    if (Help == null) {
    Help = new JMenu("Help");
    Help.add(getAboutMyDraw());
    }
    return Help;
    }
    private JMenuItem getAboutMyDraw() {
    if (AboutMyDraw == null) {
    AboutMyDraw = new JMenuItem();
    AboutMyDraw.setText("About MyDraw");
    }
    return AboutMyDraw;
    }
    private JPanel getJPanel() {
    if (jPanel == null) {
    GridLayout gridLayout1 = new GridLayout();
    jPanel = new JPanel();
    jPanel.setLayout(gridLayout1);
    jPanel.setPreferredSize(new java.awt.Dimension(100,70));
    gridLayout1.setRows(8);
    jPanel.add(getDrawPen(), null);

    }
    return jPanel;
    }



    private JButton getDrawPen() {
    if (DrawPen == null) {
    DrawPen = new JButton();
    DrawPen.setText("DrawPen");

    }
    return DrawPen;
    }


    private JPanel getJPanel1() {
    if (jPanel1 == null) {
    jPanel1 = new JPanel();
    jPanel1.setLayout(new BorderLayout());
    jPanel1.add(this);

    jPanel1.setBounds(100,80,250,250);
    jPanel1.setBackground(java.awt.Color.white);
    }
    return jPanel1;
    }
      public static void main(String[] args)
    {
    MyDraw1 md = new MyDraw1();
    }
    }
      

  5.   

    问题不在你的 JPanel,而在你的 Canvas 上,
    public class MyDraw1 extends Canvas
    你的 MyDraw1 是从 java.awt.Canvas 继承的,这是一个 awt 组件。
    如果混用 awt 组件了 swing 组件,就可能产生你遇到的那种情况。我在这篇文章里提到了这个问题
    http://www3.ccw.com.cn/club/bbs/showEssence.asp?id=16450如果你用 swing 组件,可以用从 JComponent 或者 JPanel 继承,以实现自绘功能(即类似 Canvas 的功能),只是设置大小的时候,要用 setPreferredSize,不然可能会被 Layouter 挤扁