2016-04-27 9 views
1

私は、Java GUIプログラミングには初めてです。 私はJFrameを作成しました。 このJFrameの中には、JPanelが作成されています。 このJPanelの中に別のJPanel(「A」と呼ぶこともできます)を作成しました。JFrameのJPanelで子JPanelを見ることができません

"A"で四角形を描き、グラフィックスを使用してボタンを作成したかったのです。 私のguiに矩形はありません。 "A"内のpaintComponent()メソッドが呼び出されていないことがわかりました。

コード: の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); 
     } 
    } 
} 

EDIT(子JPanelは内部クラスです)。今はうまくいくようです。

+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(); 
       } 
      } 
     }); 
    } 
} 

私はあなたのMemoryPanelに若干の変更をapplyedました:あなたのMemoryButtonMemButtonを交換し、テストのためにその可視性を向上させるために赤で四角形を埋めます。この最後の変更がなければ、矩形も表示されます。

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

グラフィックスをボタンとして機能させるには、まずJButtonをプログラミングする必要があります。

Creating a custom button in Java

私はあなたが四角形があなたのメインパネルでそれを描き、その上にボタンを追加することができ、あなたのボタンの背景になりたい:私はこのポストはそれをお届けします信じて。異なるレイアウトを使用していくつかの順序を試してみてください。

関連する問題