2010-05-20 2 views
0

숙제의 경우 프레임이있는 "CustomButton"을 만들려고하는데 그 프레임에 두 개의 삼각형과 그 위에 사각형을 그립니다. 사용자가 우울하게되면 버튼 누르기 효과를 사용자에게 제공해야합니다. 그래서 처음에는 두 개의 삼각형과 사각형을 그린 시작 그래픽을 설정하려고합니다. 내가 가지고있는 문제는 내가 프레임을 200, 200, 삼각형으로 설정했지만 프레임 크기의 정확한 끝으로 생각한다. 프로그램을 실행할 때 창을 확장하여 전체 작품을 만들고, 내 "CustomButton"을 볼 수 있습니다. 그게 정상인가요? 감사.간단한 프레임 및 그래픽에 대한 도움말

코드 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class CustomButton 
{ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       CustomButtonFrame frame = new CustomButtonFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class CustomButtonFrame extends JFrame 
{ 
    // constructor for CustomButtonFrame 
    public CustomButtonFrame() 
    { 
     setTitle("Custom Button"); 
     setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
     CustomButtonSetup buttonSetup = new CustomButtonSetup(); 
     this.add(buttonSetup); 
    } 

    private static final int DEFAULT_WIDTH = 200; 
    private static final int DEFAULT_HEIGHT = 200; 

} 

class CustomButtonSetup extends JComponent 
{ 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 

     // first triangle coords 
     int x[] = new int[TRIANGLE_SIDES]; 
     int y[] = new int[TRIANGLE_SIDES]; 
     x[0] = 0; y[0] = 0; 
     x[1] = 200; y[1] = 0; 
     x[2] = 0; y[2] = 200; 
     Polygon firstTriangle = new Polygon(x, y, TRIANGLE_SIDES); 

     // second triangle coords 
     x[0] = 0; y[0] = 200;  
     x[1] = 200; y[1] = 200; 
     x[2] = 200; y[2] = 0; 
     Polygon secondTriangle = new Polygon(x, y, TRIANGLE_SIDES); 

     g2.drawPolygon(firstTriangle); 
     g2.setColor(Color.WHITE); 
     g2.fillPolygon(firstTriangle); 

     g2.drawPolygon(secondTriangle); 
     g2.setColor(Color.GRAY); 
     g2.fillPolygon(secondTriangle); 

     // draw rectangle 10 pixels off border 
     g2.drawRect(10, 10, 180, 180); 

    } 
    public static final int TRIANGLE_SIDES = 3; 
} 

답변

1

시도하여 CustomButtonSetup 클래스에

public Dimension getPreferredSize() { 
    return new Dimension(200, 200); 
} 

를 추가.

그리고이 pack() :

원인에 API를-문서에서 (이 창을

setTitle("Custom Button"); 
    //setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
    CustomButtonSetup buttonSetup = new CustomButtonSetup(); 
    this.add(buttonSetup); 
    pack(); 

을 수행하는 서브 컴퍼넌트의 추천 사이즈 및 레이아웃에 맞게 크기가된다.

당신은 같은 얻어야한다 : 그것은 크기가 아니라 당신이 위해 등 테두리, 창 제목, 아이콘을 포함한 전체 프레임입니다 설정

enter image description here

+0

기본 변수를 정적 변수에 저장하고 getPreferredSize()로 반환하는 것이 좋습니다. 그렇지 않으면 getPreferredSize()가 호출 될 때마다 새 인스턴스가 생성되며 이는 레이아웃에 따라 자주 발생할 수 있습니다. –

+0

좋은 지적. 더 나은 해결책은 아마 구성 요소의 생성자에서'setPreferredSize()'를하는 것입니다. OP가 이것을 읽길 바랍니다. – aioobe

1

DEFAULT_WIDTHDEFAULT_HEIGHT을 드로잉 캔버스 자체의 따라서 200x200 캔버스에서 무언가를 그릴 경우 해당 캔버스를 포함하는 200x200 창에 꼭 맞을 필요는 없습니다.