2014-10-20 4 views
0

Test 클래스에서는 3 개의 패널을 만듭니다. 수업 시간에 자유로운 그림을 그립니다.Java로 자유롭게 그림 그리기, JPanel에 그림 추가

내 개체 d를 centerPanel에 추가하려고합니다. 내가 할 때 아무 것도 끌지 않습니다. 하지만 프레임에 추가하면 (getContentPane(). add를 사용하여) 그립니다. 문제가 어디에 있는지 아는 사람이 있습니까?

topPanel = new JPanel(); 
    centerPanel = new JPanel();  
    bottomPanel = new JPanel(); 

    Draw d = new Draw(); 
    getContentPane().add(d, BorderLayout.CENTER); //This works 
    add(topPanel, BorderLayout.PAGE_START);     
    add(bottomPanel, BorderLayout.PAGE_END); 


    /* I WANT THIS TO WORK INSTEAD    */ 
    /* centerPanel.add(d);      */ //How can I write this line of code? 
    /* add(topPanel, BorderLayout.PAGE_START); */    
    /* add(centerPanel, BorderLayout.CENTER);  */  
    /* add(bottomPanel, BorderLayout.PAGE_END); */ 

클래스 그린다

public class FreeHand extends JComponent, MouseListener, MouseMotionListener {  
    int x; 
    int y; 
    int posX; 
    int posY; 

    public FreeHand() 
    { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    @Override 
    public void mousePressed(MouseEvent me) {    
     posX = me.getX(); 
     posY = me.getY(); 
    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     Graphics g = getGraphics(); 
     g.setColor(Color.RED); 
     g.drawLine(posX, posY, me.getX(), me.getY()); 
     posX = me.getX(); 
     posY = me.getY(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent me) {} 

    @Override 
    public void mouseClicked(MouseEvent me) {} 

    @Override 
    public void mouseEntered(MouseEvent me) {} 

    @Override 
    public void mouseExited(MouseEvent me) {} 

    @Override 
    public void mouseReleased(MouseEvent me) {} 
}   
+0

'getGraphics'를 사용하여'paintComponent' 바깥쪽에 페인트하는 것이 옳은 방법이 아닙니다. [내 대답은 여기] (http://stackoverflow.com/quest)를 읽으십시오. ion/21322353/java-jpanel-getgraphics/21322873 # 21322873)을 참조하십시오. (이미지를 그린 다음 패널에 이미지를 그립니다.) – Radiodef

답변

2

getContentPane()에 추가 (d, BorderLayout.CENTER). //이 콘텐츠 창은 BorderLayout를 사용하며,이 센터에 추가 될 때, 레이아웃 매니저가 그리기 구성 요소에 사용 가능한 모든 공간을 제공하기 때문에 작동

작동합니다.

centerPanel.add(d);      
add(centerPanel, BorderLayout.CENTER); 

BorderLayout이 "centerPanel"에 모든 공간을 제공하기 때문에 이것은 작동하지 않습니다. 그러나 "centerPanel"은 FlowLayout을 사용하며 기본적으로 FlowLayout은 추가 된 모든 구성 요소의 기본 크기를 존중합니다 .Draw 클래스의 크기가 0이 아니므로 크기가 0이 아니므로

레이아웃 관리자를 변경할 수 있습니다 centerPanel에서 BorderLayout을 사용하거나 Draw 클래스의 getPreferredSize() 메서드를 재정의하여 패널의 적절한 기본 크기를 반환 할 수 있습니다.

질문은 왜 "centerPanel"을 추가로 만드시겠습니까?

+0

설명해 주셔서 감사합니다. centerPanel에 그려야하는 이유는 centerPanel의 배경색이 흰색으로 설정 되었기 때문입니다. Borderlayout.center의 배경색을 변경하는 방법을 모르겠습니다. – user2939293

+0

@ user2939293, 'Borderlayout.center의 배경색을 변경하는 방법을 모르겠습니다.'원하는대로 배경을 칠할 수있는 사용자 지정 구성 요소를 만들고 있습니다. JPanel을 확장하는 것이 더 쉬울 것입니다. 그런 다음 배경을 설정하면됩니다. 또한 도움을받을 때 대개 응답을 "수락"합니다. – camickr