2015-04-14 59 views
1

我有一個關於我的撲克計算器的佈局問題。我的JFrame存在頂部面板與網格佈局和中心面板與邊界佈局。該中心面板在BorderLayout.CENTER和中添加了JLabel以及BorderLayout.CENTER中的圖像和JPanelBorderLayout.NORTH中的面板有兩個JButton。現在我想在JLabel之上放置一個JButton,但我不能這樣做centerPanel.add(boardCard1.BorderLayout.CENTER);,因爲我已經爲JLabel做了這個。我怎樣才能解決這個問題,並將Cards放在桌子的中央?我只在代碼片段中加入了aceClubs Card,以提供更好的可讀性。JButton在JLabel之上

public class OddsCalculator extends JFrame{ 

JPanel topPanel; 
JLabel tablePicture; 
JPanel centerPanel; 
//ImagePanel panel = new ImagePanel(new ImageIcon(this.getClass().getResource("/images/pokertable.png")).getImage()); 
JPanel centerPanelNorth; 

Card aceClubs; 

Card playerOneCardOne; 
Card playerOneCardTwo; 
Card playerTwoCardOne; 
Card playerTwoCardTwo; 
Card playerCardSpotTarget; 
Card playerCardSpotSender; 

Player player1=new Player(); 
Player player2=new Player(); 

Card boardCard1=new Card(); 
Card boardCard2=new Card(); 
Card boardCard3=new Card(); 
Card boardCard4=new Card(); 

Board board=new Board(); 



public OddsCalculator(){ 
    initUI(); 
} 


public void initUI() { 
    //cardsPanel=new JPanel(new GridLayout(4,13,0,0)); 
    setLayout(new BorderLayout()); 
    topPanel = new JPanel(new GridLayout(4,13,0,0)); 
    centerPanel=new JPanel(new BorderLayout()); 
    tablePicture = new JLabel(new ImageIcon(this.getClass().getResource(Constants.POKERTABLE_ICON))); 
    centerPanelNorth=new JPanel(); 

    aceClubs=new Card(); 

    playerOneCardOne=new Card(); 
    playerOneCardTwo=new Card(); 
    playerTwoCardOne=new Card(); 
    playerTwoCardTwo=new Card(); 

    boardCard1=new Card(); 
    boardCard2=new Card(); 
    boardCard3=new Card(); 

    board=new Board(); 

    //setLayout(new FlowLayout(FlowLayout.LEFT)); 

    topPanel.setPreferredSize(new Dimension(1200,450));//was 1000/600 

    getContentPane().add(topPanel,BorderLayout.NORTH); 

    //setSize(1000,1600); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 


    aceClubs.suit=Constants.CARD_SUIT_CLUBS; 
    aceClubs.kind=Constants.CARD_KIND_ACE; 
    aceClubs.iconPath=Constants.ACE_CLUBS_ICON; 

    aceClubs.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(aceClubs.iconPath))); 
    aceClubs.setBorder(null); 
    aceClubs.setContentAreaFilled(false); 
    aceClubs.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      MouseClicked(evt); 
     } 
    }); 
    topPanel.add(aceClubs,BorderLayout.PAGE_START); 


    getContentPane().add(centerPanel,BorderLayout.CENTER); //was centerpanel 


    //PLAYER 1 CARD SPOTS 
    playerOneCardOne.iconPath=Constants.CARD_BACKSIDE; 
    playerOneCardOne.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(playerOneCardOne.iconPath))); 
    playerOneCardOne.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    playerOneCardOne.setBorderPainted(false); 
    playerOneCardOne.setContentAreaFilled(false); 
    playerOneCardOne.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    //centerPanel.add(playerOneCardOne,BorderLayout.WEST); //was centerpanel 

    playerOneCardTwo.iconPath=Constants.CARD_BACKSIDE; 
    playerOneCardTwo.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(playerOneCardTwo.iconPath))); 
    playerOneCardTwo.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    playerOneCardTwo.setBorderPainted(false); 
    playerOneCardTwo.setContentAreaFilled(false); 
    playerOneCardTwo.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    //centerPanel.add(playerOneCardTwo,BorderLayout.EAST); 


    //BOARD CARD SPOTS 
    boardCard1.iconPath=Constants.CARD_BACKSIDE; 
    boardCard1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(boardCard1.iconPath))); 
    boardCard1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    boardCard1.setBorderPainted(false); 
    boardCard1.setContentAreaFilled(false); 
    boardCard1.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    boardCard1.boardPosition=1; 
    // centerPanel.add(boardCard1); 

    boardCard2.iconPath=Constants.CARD_BACKSIDE; 
    boardCard2.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(boardCard2.iconPath))); 
    boardCard2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    boardCard2.setBorderPainted(false); 
    boardCard2.setContentAreaFilled(false); 
    boardCard2.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    //centerPanel.add(boardCard1,SwingConstants.CENTER); 
    boardCard2.boardPosition=2; 
    //centerPanel.add(boardCard2); 

    boardCard3.iconPath=Constants.CARD_BACKSIDE; 
    boardCard3.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(boardCard3.iconPath))); 
    boardCard3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    boardCard3.setBorderPainted(false); 
    boardCard3.setContentAreaFilled(false); 
    boardCard3.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    //centerPanel.add(boardCard1); 
    boardCard3.boardPosition=3; 
    //centerPanel.add(boardCard3); 

    boardCard4.iconPath=Constants.CARD_BACKSIDE; 
    boardCard4.setIcon(new javax.swing.ImageIcon(this.getClass().getResource(boardCard4.iconPath))); 
    boardCard4.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 5)); 
    boardCard4.setBorderPainted(false); 
    boardCard4.setContentAreaFilled(false); 
    boardCard4.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      PlayerOneMouseClicked(evt); 
     } 
    }); 
    //centerPanel.add(boardCard1,SwingConstants.CENTER); 
    //boardCard4.boardPosition=4  
    //centerPanel.add(boardCard4); 

    centerPanel.add(tablePicture,BorderLayout.CENTER); //TABLE 
    centerPanel.add(centerPanelNorth,BorderLayout.NORTH); 
    centerPanelNorth.add(playerOneCardOne); 
    centerPanelNorth.add(playerOneCardTwo); 
    //How to add for example boardCard1 on top of the table? 

} 

private void MouseClicked(java.awt.event.MouseEvent evt) {        

    //JButton b=(JButton)evt.getSource(); 
    playerCardSpotSender=(Card)evt.getSource(); 
    System.out.println(playerCardSpotSender.suit+" "+playerCardSpotSender.kind); 

    if (playerCardSpotTarget != null && playerCardSpotTarget.isBorderPainted()) { 
     playerCardSpotSender.setLocation(playerCardSpotTarget.getLocation()); 
     System.out.println(playerCardSpotTarget.getLocation()); 

    } 

} 

private void PlayerOneMouseClicked(java.awt.event.MouseEvent evt){ 
    //JButton b=(JButton)evt.getSource(); 
    playerCardSpotTarget=(Card)evt.getSource(); 

    if(playerCardSpotTarget.isBorderPainted()){ 
     playerCardSpotTarget.setBorderPainted(false); 
    } 
    else{ 
     playerCardSpotTarget.setBorderPainted(true); 
    } 

} 

public static void main(String[] args) { 
    OddsCalculator oc=new OddsCalculator(); 
    oc.setVisible(true); 
    oc.pack(); 

    } 
} 

Card.java

public class Card extends JButton{ 
int suit; 
int kind; 
boolean known; 
String iconPath; 
Integer boardPosition; 
} 

佈局的時刻:

enter image description here

**編輯:** 我如何與OverlayLayout中心位置的按鈕?

+2

[將LayoutManager設置爲JLabel](http://stackoverflow.com/questions/8575641/how-returns-xxxsize-from-jcomponents-added-to-the-jlabel) – mKorbel

+0

@mKorbel如何在我的情況下使用它? – Sybren

+0

看起來像通過使用GBC – mKorbel

回答

0

首先您的問題太複雜,代碼太多。你的問題是關於在圖像上顯示一個按鈕。因此,用圖像創建一個框架並在圖像上添加一個按鈕。它應該需要大約20行代碼來創建一個簡單的程序來完成此操作。然後,一旦你瞭解如何做到這一點的基本概念,你可以將更改添加到你的真實程序中。

您發佈的所有其他代碼與問題無關,完全沒有必要。在提問時學會簡化您的問題。

現在我想將一個JButton上的JLabel(在pokertable)的頂部,但我不能做centerPanel.add(boardCard1.BorderLayout.CENTER);因爲我已經爲JLabel做了這個。

,所以添加按鈕,將標籤:

label.setLayout(new GridBagLayout()); 
label.add(button, new GridBagConstraints()); 

只要你想顯示的成分比標籤上的圖像的大小的組件將在圖像中居中小。