2015-01-11 3 views
1

안녕하세요, 저는 자바로 사용자 정의 도형을 만들려고 노력하고 있습니다. 그리고 어떤 이유로 그것을 캔버스에 페인트하지 않습니다.그래픽을 Java로 그리지 않습니다.

가 나는 클래스를 만들었습니다 : 이것은 잘 작동

private void initComponents() { 
     createMenu(); 
     createToolBar(); 
     createCenterPanel(); 
     //createCanvas(); 
    } 

private void createCanvas() { 
     //c = new Canvas(); 
     //c.setBackground(Color.white); 
     // this.add(c); 
     add(new MyCircleCanvas()); 
    } 

:

public class MyCircleCanvas extends JComponent{ 
    private void doDrawing(Graphics g) { 

     Graphics2D g2d = (Graphics2D) g; 

     g2d.setColor(new Color(150, 150, 150)); 

     //g2d.fillRect(30, 20, 50, 50); 
     //g2d.fillRect(120, 20, 90, 60); 
     //g2d.fillRoundRect(250, 20, 70, 60, 25, 25); 

     //g2d.fill(new Ellipse2D.Double(10, 100, 80, 100)); 
     //g2d.fillArc(120, 130, 110, 100, 5, 150); 
     g2d.fillOval(270, 130, 50, 50); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     doDrawing(g); 
    }  

} 

그런 다음 내 JFrame의에 내가이 클래스를 호출합니다. 하지만 JButton의 ActionListener에서 createCanvas() 메서드를 호출하려고하면 원하는 모양이 만들어지지 않습니다. 어떤 제안 ???

+0

은'createCanvas는() '메서드를 대신 호출해야한다'drawShape()'이미이 캔버스를 사용 GUI에 추가되었습니다. 더 나은 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소 완성 입증 가능 사례) 또는 [SSCCE] (http://www.sscce.org/) (간략히, 자체 포함 , 올바른 예). –

+0

캔버스에 새 MyCircleCanvas()를 추가하고 사각형을 가져 오는 방법은 무엇입니까? –

답변

1

paintComponent 대신 paint 메서드를 덮어 써야합니다. MyCircleCanvas ses를 그래픽 사용자 인터페이스에 추가하려면 BoxLayout으로 JPanel을 만들었습니다. 이 패널에는 새로 추가 된 MyCircleCanvas 개의 항목이 세로로 추가됩니다.

getPreferredSize 메서드를 반드시 덮어 씁니다. 그렇지 않으면 사용자 인터페이스에 추가 할 때 'MyCircleCanvas'의 크기가 표시되지 않기 때문입니다.

또한 pack 메서드는 JFrame이 새로운 MyCircleCanvas을 포함하도록 적절하게 크기가 조정됩니다.

public class MyCircleCanvas extends JComponent { 
    private void doDrawing(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(new Color(150, 150, 150)); 
     g2d.fillOval(25, 25, 50, 50); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     doDrawing(g); 
    } 

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

그리고이 프레임 :

public class CircleCanvasFrame extends JFrame implements ActionListener { 
    private JPanel circlePanel = new JPanel(); 

    public CircleCanvasFrame() { 
     setVisible(true); 
     setSize(400, 400); 
     circlePanel.setLayout(new BoxLayout(circlePanel, BoxLayout.Y_AXIS)); 
     JButton button = new JButton("add a circle canvas"); 
     button.addActionListener(this); 
     add(button, BorderLayout.NORTH); 
     add(circlePanel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     new CircleCanvasFrame(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     circlePanel.add(new MyCircleCanvas()); 
     pack(); 
    } 
} 
+0

네, 잘 작동합니다. 하지만 그 일은 JButton의 ActionListener에서 새로운 MyCircleCanvas를 JFrame에 추가하는 방법입니다. ??? –

+0

@KostasDrakonakis, 나는 버튼을 사용하여 더 많은 패널을 추가하기 위해 위의 예제를 편집했습니다. –

0

귀하의 문제는 당신이 너무 멀리 볼 수있는 타원형 위치한다는 것이다. 위치를 원점에 가깝게 만듭니다. 여기

private void doDrawing(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.YELLOW); 
     g2d.fillOval(0, 0, 50, 50); 
    } 

은이 후 수행하는 방법은 대략 생각이다 :

EventQueue.invokeLater(new Runnable() { 
      public void run(){ 
       final JFrame frame = new JFrame(); 
       JButton button = new JButton("test"); 
       frame.setLayout(new FlowLayout()); 

       button.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 

         MyCircleCanvas circle = new MyCircleCanvas(); 
         frame.add(circle); 
         frame.pack(); 

        } 
       }); 

       frame.add(button); 
       frame.setSize(100,100); 
       frame.setVisible(true); 
      } 
     }); 
관련 문제