2016-08-14 6 views
0

나는 게임 보드를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 여러 조각 중 하나를 선택하여 플레이어가 조각을 배치 할 수있는 게임을 구현 중입니다. "핫 시트"모드에서는 두 플레이어가 동일한 UI를 사용하므로 다른 메뉴 인스턴스가 표시됩니다.JPopupMenu를 즉시 렌더링하는 방법은 무엇입니까?

JMenuItem.show 메서드를 호출하면 잘못된 메뉴가 먼저 렌더링되고 메뉴 항목에 사용 된 아이콘이 각 플레이어의 배경색이 다르기 때문에 신속하게 올바른 메뉴로 바뀝니다.

show을 호출 한 직후 Thread.sleep(1000)을 추가하여 문제를 악화시킬 수 있습니다. 그런 다음 마우스 오른쪽 버튼을 클릭하면 이전에 표시된 다른 플레이어의 메뉴 (또는 첫 번째 호출시 올바른 크기의 배경 만)가 1 초 동안 표시된 다음 메뉴가 새로 고쳐지면서 올바른 부분이 렌더링됩니다.

올바른 메뉴를 즉시 렌더링 할 수있는 방법이 있습니까?

중요한지 확실하지 않지만 isPopupTrigger 분기의 클릭 처리 콜백에서 repaint에 대한 호출이 없습니다.

편집 : 편집 2

난 단지 Mac에서이 문제를보고 있어요

import java.awt.event._ 
import javax.swing._ 

object MenuDemo extends App { 
    val frame = new JFrame() 
    frame.setTitle("Menu Demo") 
    frame.setSize(600, 400) 
    frame.setLocation(0, 0) 
    frame.addWindowListener(new WindowAdapter { 
    override def windowClosing(e: WindowEvent): Unit = System.exit(0) 
    }) 

    var index = 0 
    def tick() = index = (index + 1) % 2 

    def makeMenuItem(i: Int) = { 
    val menuItem = new JMenuItem("item in menu #" + i) 
    menuItem.addActionListener(new ActionListener { 
     override def actionPerformed(e: ActionEvent): Unit = tick() 
    }) 
    menuItem 
    } 

    def makeMenu(i: Int) = { 
    val menu = new JPopupMenu() 
    menu.add(makeMenuItem(i)) 
    menu 
    } 

    val menus: Seq[JPopupMenu] = Seq(0, 1).map(i => makeMenu(i)) 

    def showMenu(e: MouseEvent): Unit = { 
    menus(index).show(e.getComponent, e.getX, e.getY) 
    Thread.sleep(1000) 
    } 

    val panel = new JPanel() 
    panel.add(new JLabel("right click me")) 

    panel.addMouseListener(new MouseAdapter { 
    override def mousePressed(e: MouseEvent): Unit = { 
     if (e.isPopupTrigger) showMenu(e) 
    } 

    override def mouseReleased(e: MouseEvent): Unit = { 
     if (e.isPopupTrigger) showMenu(e) 
    } 
    }) 

    frame.getContentPane.add(panel) 
    frame.setVisible(true) 
} 

스칼라에 예를 추가. Windows에서는 메뉴가 표시되기 전에 지연이 발생합니다.

+1

문제를 재현하는 [mcve]를 게시 해보십시오. – copeg

+0

'올바른 메뉴를 즉시 렌더링하는 방법이 있습니까? '- 이것이 기본 동작이며 코드에 문제가 있습니다. [팝업 메뉴 실행] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#popup)에 대한 스윙 튜토리얼의 – camickr

답변

0

show 메서드가 호출 된 후 메뉴 항목이 재구성 될 수있는 것 같습니다. 예를 들어 javax.swing.event.PopupMenuListener.popupMenuWillBecomeVisible은 컨텍스트에 따라 메뉴 항목을 재설정 할 수 있습니다.

이 경우 팝업 메뉴의 두 가지 인스턴스를 사용하고 상황에 따라 둘 중 하나에서 show를 호출하여 깜박임을 피할 수 있습니다.

+0

예제를 읽으십시오. 정확히 내가 가지고있는 것입니다. : 두 개의 메뉴, 재구성 없음 (개별 항목의 활성화 및 비활성화 제외). – StokedOver9k