2015-01-21 5 views
1

다른 세 개의 패널을 포함하는 JPanel을 확장하는 클래스가 있습니다. 3 개의 패널을 그립니다. 내 코드가 어떨까요? 내가 뭘 잘못하고 있니? 방금 ​​실행 후 빈 프레임이 있습니다.하나의 JPanel에 포함 된 여러 JPanel에서 그리기

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Thumbnail extends JPanel { 

    private JPanel bigPanel; 
    private JPanel panelOne; 
    private JPanel panelTwo; 
    private JPanel panelThree; 

    public Thumbnail() { 

     panelOne = new JPanel() { 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.black); 
       g.drawString("writing something", 10, 10); 
       g.drawRect(10, 10, 50, 50); 
      } 
     }; 
     bigPanel = new JPanel(); 
     bigPanel.add(panelOne); 
     this.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     this.add(bigPanel); 
     //other codes... 
    } 

    public static void main(String[] args) { 
     JFrame jf = new JFrame(); 
     Thumbnail tb = new Thumbnail(); 
     jf.add(tb); 
     jf.pack(); 
     jf.setVisible(true); 
    } 
} 

답변

2

panelOne 기본적으로 의미 레이아웃 매니저에 대한 레이아웃 정보를 제공하지 않습니다, 그것은 선호하는 사이즈는 ... 뭔가를 추가 0x0

시도이다 panelOne

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(100, 100); 
} 

...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Thumbnail extends JPanel { 

    private JPanel bigPanel; 
    private JPanel panelOne; 
    private JPanel panelTwo; 
    private JPanel panelThree; 

    public Thumbnail() { 

     panelOne = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.black); 
       g.drawString("writing something", 10, 10); 
       g.drawRect(10, 10, 50, 50); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(100, 100); 
      } 

     }; 
     bigPanel = new JPanel(); 
     bigPanel.add(panelOne); 
     this.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     this.add(bigPanel); 
     //other codes... 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 
       JFrame jf = new JFrame(); 
       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Thumbnail tb = new Thumbnail(); 
       jf.add(tb); 
       jf.pack(); 
       jf.setLocationRelativeTo(null); 
       jf.setVisible(true); 
      } 
     }); 
    } 
} 
,363,210

당신은 자세한 내용

에 대한 Initial ThreadsLaying Out Components Within a Container을 살펴하는 것 같아서 panelTwo 및 panelThree 사용하지 않는 것으로 보인다
+0

문제 감사! 나는 한 가지 질문을 여전히 가지고있다. 패널에 인스턴스 용 JButton을 추가하면, 버튼이 보이도록 패널의 크기를 조정할 필요가 없다는 것인가? –

+1

버튼은 속성 (텍스트, 여백, 테두리 ...)에 따라 필요한 크기를 계산할 수 있기 때문에 – MadProgrammer

2
bigPanel = new JPanel(new GridLayout(3,1)); 
bigPanel.add(panelOne, BorderLayout.NORTH); 
bigPanel.add(panelTwo, BorderLayout.CENTER); 
bigPanel.add(panelThree, BorderLayout.SOUTH); 

. .

this.getContentPane().add(bigPanel); 

편집 :
그것은 그렇지 않으면 목적은 컨테이너로 JDialog를 사용하는 것입니다 만 경우에, 당신의 패널의 모든를 JDialog에 확장 한 다음 JFrame의를 추가하고 더 나은, 코드 괜찮습니다.

+0

- 내가 뭔가를 누락하지 않는? –

+0

위의 코드를 'bigPanel'위에 표시하고이 클래스의 JPanel 내부에 표시하는 데 사용하는 방법입니다. – roeygol

+0

* "JDialog를 확장하는 것이 좋습니다"* - 지금은 당신은 하나의 유스 케이스에 자신을 가둬 뒀습니다. 'JPanel'을 확장하고 원하는 컨테이너에 패널을 추가하는 것이 훨씬 더 유연한 옵션입니다. – MadProgrammer

관련 문제