簡體   English   中英

Java Swing:Swing Worker,invokeAndWait和重疊的JLabel

[英]Java Swing: Swing Worker, invokeAndWait and Overlapping JLabels

大家好,我遇到了2個問題,都與Java Swing有關。 我正在用Java開發紙牌游戲。 我使用類型的arreays列表來保存每張卡的值,並且我有一個主要的Play()方法,該方法使用invokeLater和對我的GUI類的Singleton方法調用對GUI的更新。

  1. 第一個問題很簡單。 我使用JLabel在GUI上創建卡,如下所示: 附加相關事件偵聽器並將其添加到適當的面板(在本例中為“人手面板”):

      for (int i = 0; i < (HumanHand.size()); i++) { Card card = HumanHand.get(i); BufferedImage cardImage = null; try { cardImage = ImageIO.read(new File("card/" + card + ".jpg")); } catch (IOException e) { e.printStackTrace(); } JLabel picLabel = new JLabel(new ImageIcon( cardImage )); picLabel.addMouseListener((MouseListener) me); HumanHandDisplay.add(picLabel); } //HumanHandDisplay.validate(); HumanHandDisplay.updateUI(); 

我遇到的問題是,當人的手超過7張卡片左右時,它將創建較大的面板區域並在下面開始新的一排卡片。 我想做的是,當手達到一定大小時,卡片開始相互重疊(就像您將卡片握在手中一樣)。 我搞砸了.validate(),卻一無所獲。 您在這里可以提供的任何幫助都將受到歡迎。

  1. 我的第二個問題是關於使用Swing Worker返回人類玩家的紙牌選擇。 我已經閱讀了一些有關Swing工作者的信息,但是我不確定在自己的游戲中實現Swing工作者的最佳方法。 目前,使用控制台,我有一個掃描器,然后將一個int的輸入作為選擇(特定卡在ArrayList中的位置)。 我希望通過單擊玩家手中的卡來選擇此int。 目前,我使用:

      String name = "" + i; picLabel.setName(name); 

    在創建它們的for循環中將Card JLabels的名稱設置為int(如圖所示^^),我使用:

      public void mouseClicked(MouseEvent e) { String name = ((JLabel)e.getSource()).getName(); System.out.println("Working " + name); selection = Integer.parseInt(name); } 

    單擊其中一張卡片時返回該int。 這也是我一直從Play()調用GUI方法的方法:

      SwingUtilities.invokeLater(new Runnable() { public void run() { GUI.getInstance().UpdateHand(); } }); 

    我的問題是,如何獲得Play方法來調用GUI類中的方法,該方法將使用適當的偵聽器(這時將其稱為GUIPlayerSelection())建立起手形,然后等待玩家單擊卡,然后將int返回到我的主類中代表所選卡的Play()方法中。 我不確定如何使用調用和等待,例如,如果我使用調用和等待,它將只是等待卡的設置,還是會等待mouseClicked()方法完成? 還是我需要做其他事情以確保它在手設置好之后等待鼠標單擊? 然后我將如何返回該int? 我被告知要使用搖擺工人,但如果有人可以解釋我在這種情況下如何實現這一點,那就太好了。

先感謝您。

對於第一個問題,您是否在獲取框架以重新粉刷或卡片布局方面遇到問題?

如果是后者,那么您可能想看看Java Layout Managers ,它描述了JFrame內的內容窗格如何組織添加到其中的組件。

如果這些都不適合您(我認為它們不會與您描述的一樣),則可以使用setBounds方法手動對齊JLabel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM