나는 게임 보드를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 여러 조각 중 하나를 선택하여 플레이어가 조각을 배치 할 수있는 게임을 구현 중입니다. "핫 시트"모드에서는 두 플레이어가 동일한 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에서는 메뉴가 표시되기 전에 지연이 발생합니다.
문제를 재현하는 [mcve]를 게시 해보십시오. – copeg
'올바른 메뉴를 즉시 렌더링하는 방법이 있습니까? '- 이것이 기본 동작이며 코드에 문제가 있습니다. [팝업 메뉴 실행] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#popup)에 대한 스윙 튜토리얼의 – camickr