Java JMenuBar重绘背景

时间:2014-09-03 14:25:21

标签: java swing jpanel repaint jmenubar

最近我一直在使用java和swing进行练习并且遇到了问题

我有一个"欢迎屏幕"随机生成一些背景。

我重写了paintComponent,并根据当前的JPanel分辨率绘制了背景。不仅仅是椭圆形的东西

before

但是当我使用菜单时,菜单的背景会重新粉刷。

after

椭圆的大小和底部基于屏幕分辨率。 有什么办法可以解决吗?

注意:欢迎面板是JPanel

2 个答案:

答案 0 :(得分:1)

这是因为PopUpMenu下的区域在关闭popUp后重绘,但其他区域没有。

您可以在关闭popUp之后重新绘制面板,如下一行:

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;


public class TestFrame extends JFrame {

    public TestFrame() {
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void init() {
        DrawPanel p = new DrawPanel();
        add(p);

        JMenuBar bar = new JMenuBar();
        JMenu menu = new JMenu("menu");
        JPopupMenu popupMenu = menu.getPopupMenu();
        popupMenu.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {

            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
                repaint();
            }

            @Override
            public void popupMenuCanceled(PopupMenuEvent arg0) {

            }
        });
        bar.add(menu);
        menu.add(new JMenuItem("item"));
        setJMenuBar(bar);
    }


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


    private class DrawPanel extends JPanel{

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100,100);
        }

        @Override
        protected void paintComponent(Graphics arg0) {
            super.paintComponent(arg0);

            Random r = new Random();
            int nextInt = r.nextInt(20);
            arg0.drawOval(nextInt, nextInt, 20, 20);
        }
    }
}

答案 1 :(得分:-1)

在位图上绘制背景,并使用paintComponent()方法复制它。 paint事件可以“随时”发生,在这种情况下,随机源会生成新值。

另一种解决方案:创建一个方法getRandom(),使用相同的种子创建一个Random对象,然后使用它。例如:

  protected long seed = 0L;

  protected void initRandom() { // call this in constructing time
      seed = Calendar.getInstance().getTimeInMillis();
  }

  protected Random getRandom() { // call this at the start of the painting method
      return new Random(seed);
  }

这将为所有窗口实例创建新种子,并始终如一地使用它。任何重画都不会产生不良影响。