2014-09-03 4 views
1

В последнее время я experementing с Явой и качелями, и я столкнулся с проблемойJava JMenuBar перекрашивать фон

У меня есть «экран приветствия» с каким-то сгенерированным случайным фоном.

Я переопределил paintComponent и заставил его покрасить фон на основе текущего разрешения JPanel. Не то, что фантазии просто овалов

before

Но когда я использую меню, фон меню перекрашивают.

after

Размер и potision овалов основаны на разрешение экранов. Есть ли способ решить?

Примечание: Добро пожаловать панель JPanel

+1

Где ваш код? Отправьте свой код в вопрос, см. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – DavidPostill

+0

Какая часть кода вам действительно нужна? Является просто методом paintComponent с randoms() –

+0

минимальным, полным и проверяемым примером, поэтому мы можем его компилировать и запускать ... – DavidPostill

ответ

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); 
     } 
    } 
} 
+0

Спасибо, что работа. Но он снова перерисовывает все окно, но я думаю, что другого пути нет –

+0

Вы можете перекрасить только цель «JPanel» с эллипсами. – alex2410

+0

Это неправильное решение. См. Мой расширенный ответ, пожалуйста! –

-1

Нарисуйте фон на растровом изображении, а затем скопировать его в методе paintComponent(). Событие рисования может происходить «в любое время», и в этом случае ваш случайный источник генерирует новые значения.

Другое решение: введите способ getRandom(), который создает объектс тем же семенем и использует его. Например:

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); 
    } 

Это создает новое семя для всех экземпляров окна и использует его последовательно. Любая перекраска не будет иметь никакого нежелательного эффекта.

+0

Любые комментарии от downvoter? –

Смежные вопросы