2011-08-07 15 views
2

我有一個撲克遊戲,我設計了一個漂亮的圖形用戶界面來顯示卡片和玩家。我用了很多g2d.drawImage和g2d.drawString()的方法,在paint()內部擴展了JPanel,並確定了x和y的位置。JButton絕對在我的paint()板下

我現在的問題是,我需要在它下面有一個交互式按鈕..但每當我嘗試添加一個JButton,它會顯示頂部和中心。我已經使用了setLocation(x,y)和setLayout(null)以及我在其他回覆中看到的所有內容,但沒有一個符合我的需求(或者至少我沒有很好地理解在哪裏把它)

這是我的代碼是如何設置的: pokerserver.java

public class pokerserver extends JFrame { 

    public pokerserver() { 
     add(new drawing());  
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(720, 640); 
     setLocationRelativeTo(null); 
     setTitle("Poker HANGOUTS"); 
     setResizable(false); 
     setVisible(true);    
    } 

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

然後在drawing.class

public drawing() {  
    setFocusable(true); 
    setBackground(new Color(39,91,46)); 
    setDoubleBuffered(true);   
    gameCards = new cards(); 
    gameCards.shuffle(); 

    for (int i = 0; i < 10; i++) 
     seats[i] = -1; 

    HQ = new HeadQuarters(this); 
    HQ.start(); 

} 

public void paint(Graphics g) { 
    super.paint(g);  

    Graphics2D g2d = (Graphics2D)g; 

    //All my UI code 
    } 

我最後的嘗試嘗試添加

JButton button = new JButton("TEST"); 
    add(button); 
    button.setLocation(10, 500); 

在公共繪圖()的末尾。一直看到在佈局管理的事情,但它不是幫助我 - 主要是因爲我不知道如何實現它

下面是截圖,以幫助可視化我在說關於我們 - >

http://i.imgur.com/ttvif.png

試圖獲取下面的按鈕。除非有辦法將一個ActionListener添加到drawImage()?

回答

3

對於您的主面板使用BorderLayout。

然後到「中心」,你可以添加你的遊戲面板所有的自定義繪畫。

然後創建一個面板並添加按鈕。現在您可以將此面板添加到主面板的北面。

換句話說,您並不侷限於使用單個面板。

此外,自定義繪畫應該在面板的paintComponent()方法中完成,而不是paint()方法。

+0

我看到有人說,paintComponent()和paint()有什麼區別?我要給面板的東西一拍 – Sebastian

+0

油漆負責繪製組件,它的邊界和它的孩子。如果您的繪畫覆蓋不會更改邊框或小孩繪畫,那麼您不會希望覆蓋paint而是paintComponent。否則你會冒着邊界和兒童繪畫的風險,帶來意想不到的後果。教程將告訴你這一切。 –

+0

好的。 至於原始問題,我認爲主要問題是我對面板的混淆 - 我知道如何將組件添加到佈局並按照這種方式進行排列,但是如何將所有的油漆組合到面板中?在教程中,它有panel.add(component),但我使用g2d.drawImage(image,x,y)? 對不起,我的java swing知識是有限的,因爲我學習了Android的開發Java,所以我瀏覽了這個部分:P – Sebastian

2

我不確定你在做什麼,但這裏有兩種解釋。

Buttons over custom paintingButtons below custom painting

我懷疑你想第一次一個人在風俗畫按鈕「,但作爲一個用戶我更喜歡第二個,用「按鈕下面的風俗畫」。

import java.awt.image.*; 
import java.awt.*; 
import javax.swing.*; 

class PaintPanel extends JPanel { 

    BufferedImage bg; 

    PaintPanel(LayoutManager2 layout) { 
     super(layout); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if (bg==null) { 
      bg = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2 = bg.createGraphics(); 
      GradientPaint gp = new GradientPaint(
       0,0,Color.RED,500,500,Color.BLUE); 
      g2.setPaint(gp); 
      g2.fillRect(0,0,500,500); 
      g2.dispose(); 
     } 

     g.drawImage(bg,0,0,getWidth(),getHeight(),this); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel buttons = new JPanel(
        new FlowLayout(FlowLayout.CENTER)); 
       buttons.setOpaque(false); 
       buttons.add(new JButton("Start")); 
       buttons.add(new JButton("Stop")); 

       PaintPanel pp = new PaintPanel(new BorderLayout()); 
       pp.setPreferredSize(new Dimension(200,100)); 

       pp.add(buttons, BorderLayout.SOUTH); 

       JOptionPane.showMessageDialog(null,pp); 

       JPanel gui = new JPanel(new BorderLayout()); 
       gui.setBackground(Color.ORANGE); 
       gui.add(pp, BorderLayout.CENTER); 
       gui.add(buttons, BorderLayout.SOUTH); 

       JOptionPane.showMessageDialog(null,gui); 
      } 
     }); 
    } 
} 
+0

我正在尋找第二個。我弄明白了,我並沒有把自己的繪畫課當作自己的JPanel來對待:PI使用了我使用的代碼大綱去了解遊戲開發教程,所以整個組件的概念讓我感到困惑......我試圖讓按鈕,而不是主畫面 – Sebastian