2014-01-14 310 views
0

我有一個類BoardGUI,它擴展了JFrame。我在JPanel中添加了按鈕。當我嘗試使用框架上的mouselistoner將面板添加到框架中時,按鈕(撤消和重放)變爲不可見。當我將鼠標放在按鈕上時,它們變得可見。將JPanel添加到JFrame中

這裏是我的代碼:

public class BoardGUI extends JFrame { 
    JButton a=new JButton("Undo"); 
    JButton r=new JButton("replay"); 
    JPanel jp=new JPanel(); 

    public BoardGUI() { 

     // TODO Auto-generated constructor stub 
     setTitle("Checkers Game"); 
     setSize(645, 700); 

     jp.setLayout(new FlowLayout()); 
     jp.setPreferredSize(new Dimension(645,35)); 
     a.setVisible(true); 
     r.setVisible(true); 
     jp.add(a); 
     jp.add(r); 
     add(jp,BorderLayout.SOUTH); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addMouseListener(new MouseListener() { 

      @Override 
      public void mouseReleased(MouseEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void mousePressed(MouseEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void mouseExited(MouseEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void mouseEntered(MouseEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void mouseClicked(MouseEvent arg0) { 
       // TODO Auto-generated method stub 
       repaint(); 

      } 
     }); 


    } 
    public void paint(Graphics g) 
    { 
     for(int i=0;i<8;i++) 
     { 
      for(int j=0;j<8;j++) 
      { 
       g.fillRect(i*100, j*100, 100, 100); 
      } 
     } 
    } 
} 

任何人可以幫助我解決這個問題嗎?

+0

的可能重複[如何設置一個JPanel在一個JFrame?](http://stackoverflow.com/questions/21112572/how-to-set-a-jpanel-over-a-jframe) –

+1

不要轉發問題。相反,編輯你問的冷杉! –

+0

我是一個非常新的計算機用戶。我不知道。我會在下次嘗試編輯它。謝謝 –

回答

4
  • 覆蓋getPreferredSizeJPanel,然後調用JFrame.pack(),而不是任何上漿

  • 不設置PreferredSize

  • 不覆蓋paintJFrame,覆蓋paintComponent的(另一,分開)JPanel,把這個JPanel加到JFrames CENTER area

.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BoardGUI extends JFrame { 

    private JButton a = new JButton("Undo"); 
    private JButton r = new JButton("replay"); 
    private JPanel jp = new JPanel(); 

    public BoardGUI() { 
     setTitle("Checkers Game"); 
     jp.setLayout(new FlowLayout()); 
     jp = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(new Dimension(645, 35)); 
      } 

      /* @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       // 
      }*/ 
     }; 
     jp.add(a); 
     jp.add(r); 
     add(jp, BorderLayout.SOUTH); 
     pack(); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new BoardGUI(); 
      } 
     }); 
    } 
} 
+1

+1覆蓋paintComponent()+ [MCVE](http://stackoverflow.com/help/mcve) – dic19

+0

這個方法做了什麼?以及它如何解決問題? –

+0

@Wasiq Noor請哪一個你的意思是 – mKorbel

0

您已經獲得了一個645 x 700的JFrame,您可以在其上繪製800 x 800棋盤。這可能會覆蓋按鈕。

將棋盤放在它自己的JPanel中,並只在該面板內繪製。將該面板放在JFrame的中心。

+0

當我的類使用JFrame進行擴展時,如何在Jpanel中繪製圖像? –

0

不要使用:

a.setVisible(true); 
r.setVisible(true); 

沒有必要使用此。當使用setVisible(true)使框架可見時,所有組件都將被繪製。