2016-04-27 187 views
1

我是java GUI編程的新手。 我創建了一個JFrame。 在這個JFrame裏面,我創建了一個JPanel。 在這JPanel裏面我創建了另一個JPanel(讓我們稱之爲「A」)。JFrame中看不到JPanel中的子JPanel

我在「A」中繪製了一個矩形,並且想要使用圖形創建按鈕。 我的gui中沒有矩形。我可以看到「A」中的paintComponent()方法未被調用。

代碼: 的JPanels:(孩子JPanel是內部類)

public class MemoryPanel extends JPanel { 

    public MemoryPanel(){ 
     setPreferredSize(new Dimension(350,448)); 
    } 

    @Override 
    public void paintComponent(Graphics g) {  
     //POSITIONING 
     setLayout(new BorderLayout()); 

     //CREATE MEMORY BUTTONS 
     MemButton a=new MemButton(); 

     //Drawing Rectangles for Memory 
     add(a,BorderLayout.CENTER); 

    } 



    private class MemoryButton extends JPanel{ 
     public MemoryButton(){ 
      setLayout(null); 
      setPreferredSize(new Dimension(87,40)); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      Graphics2D td= (Graphics2D)g; 
      td.drawRect(0, 0, 20, 20); 
     } 
    } 
} 

編輯: 感謝所有, 我不得不引起與它相同的類名的問題,另一個包。它現在看起來很有效。

+1

1)'paintComponent'方法應該用於繪製圖形,而不是用於創建和添加組件。在構造函數中這樣做。 2)如果您將按鈕添加到「BorderLayout.CENTER」,則「setPreferredSize」不會達到您所期望的。該按鈕將佔用整個可用空間。 3)不要忘記在'paintComponent'方法的開頭調用'super.paintComponent()'。此外,MemButton與MemoryButton相同嗎? - 請考慮發佈重現問題的[mcve]。 –

回答

1

我做了一個簡單的GUI來測試你的代碼,矩形顯示正確。 我沒有在您發佈的代碼中進行相關更改。

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class SimpleJFrameProgram extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public SimpleJFrameProgram() { 
     super("TEST"); 

     initComponents(); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 


    private void initComponents() { 
     MemoryPanel memoryPanel = new MemoryPanel(); 

     this.add(memoryPanel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new SimpleJFrameProgram(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

我applyed小的改動你的MemoryPanel:你MemoryButton取代MemButton和填充矩形紅色,以提高其對測試的知名度。沒有這個最後的改變,矩形也會出現。

import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 

    import javax.swing.JPanel; 

    public class MemoryPanel extends JPanel { 

    public MemoryPanel(){ 
     setPreferredSize(new Dimension(350,448)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     // POSITIONING 
     setLayout(new BorderLayout()); 

     // CREATE MEMORY BUTTONS 
     MemoryButton a = new MemoryButton(); 

     // Drawing Rectangles for Memory 
     add(a,BorderLayout.CENTER); 

    } 

    private class MemoryButton extends JPanel{ 
     public MemoryButton(){ 
      setLayout(null); 
      setPreferredSize(new Dimension(87,40)); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 

      Graphics2D td = (Graphics2D) g; 
      td.setColor(Color.red); 
      td.fillRect(0, 0, 20, 20); 
     } 
    } 
} 

這是得到的結果:

enter image description here

也許你的問題是位於初始化父JFrame

+1

謝謝,我發現了這個問題。我在同一個項目中使用了另一個名稱爲「MemButton和從那裏初始化的對象」的包。 – ALUFTW

2

您應該先編程JButtons,以使您的圖形能夠像按鈕一樣工作。我相信這個帖子會幫你:

Creating a custom button in Java

我想要一個矩形成爲你的按鈕的背景,你可以把它收回去你的主面板,並添加它的按鈕。嘗試使用不同的佈局來維持一些順序。