2016-09-23 5 views
0

나는 십자가를 형성하는 안쪽 원에 두 개의 검정색 선이있는 양궁 표적을 그려야합니다. 그러나 선이 가운데에 더 가깝도록 선을 조정할 때마다 맨 위에 표시되는 대신 이미지 뒤쪽으로갑니다. 이걸 어떻게 막을 수 있니? 별도의 지침 집합이 필요합니까?이미지 위에 자바로 선을 그려야합니다. 이미 그렸지만 이미지 위에 표시 할 수 없습니까?

package sumshapes; 

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.event.*; 
import javax.swing.*; 

public class SumShapes extends JFrame 
    implements ActionListener { 

    private JPanel panel; 

    public void paint(Graphics g) 
    { 
     g.setColor(Color.BLACK); 
     g.drawLine(250, 200, 250, 200); 
     g.drawOval(140,90,200,200); 
     g.setColor(Color.BLACK); 
     g.fillOval(140,90,200,200); 
     g.drawOval(162,109,155,155); 
     g.setColor(Color.BLUE); 
     g.fillOval(162,109,155,155); 
     g.drawOval(183,129,112,112); 
     g.setColor(Color.RED); 
     g.fillOval(183, 129, 112, 112); 
     g.drawOval(210,153,60,60); 
     g.setColor(Color.YELLOW); 
     g.fillOval(210, 153, 60, 60); 
     g.setColor(Color.BLACK); 


    } 

    public static void main(String[] args) { 
     SumShapes frame = new SumShapes(); 
     frame.setSize(500,400); 
     frame.setBackground(Color.yellow); 
     frame.createGUI(); 
     frame.setVisible(true); 
    } 

    private void createGUI(){ 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     Container window = getContentPane(); 
     window.setLayout (new FlowLayout()); 


    } 

    public void actionPerformed(ActionEvent event) { 
     Graphics paper = panel.getGraphics(); 
     paper.drawLine(20,80,120,80); 




    } 




} 
+1

1. 페인트 무시하지 마십시오 - 재정의 경량 컴퍼넌트 당신은 부모 방법의 예를 호출해야한다 (2)의'paintComponent''super.paintComponent (g) 할 필요가 전혀 없습니다'3 'JPanel'에서'getGraphics'를 호출하십시오. 드로잉은'paintComponent'로 가야합니다. https://docs.oracle.com/javase/tutorial/uiswing/painting/을 참조하십시오. – copeg

답변

-1
  1. 모든 드로잉 같은 JPanel와 같은 경량 컴퍼넌트의 paintComponent 방법으로 가야한다 :

    내 코드입니다.
  2. getGraphics으로 전화 할 필요가 없습니다.

    private JPanel panel = new JPanel(){ 
        @Override 
        public void paintComponent(Graphics g){ 
         super.paintComponent(g);//call parent method first thing 
         //paint here 
        } 
        @Override 
        public Dimension getPreferredSize(){//provided so you can size this component as necessary 
         return new Dimension(500,400); 
        } 
    }; 
    
    .... 
    frame.add(panel); 
    frame.pack(); 
    
    : 당신은) 당신이) paintComponent b에 로직을 프로그래밍해야 특정 작업에 도면을 변경 작업 C의 로직을 변경) 예를 들어, 구성 요소

repaint를 호출하려면

제쳐두고, EDT에서 Swing 구성 요소에 대한 모든 호출을 배치하는 것이 좋습니다. Swing 호출을 SwingUtilities로 주 메서드에서 래핑하는 것을 의미합니다. 예를 들어

public static void main(String[] args) throws Exception { 
    SwingUtilities.invokeAndWait(new Runnable(){ 

     @Override 
     public void run() { 
      SumShapes frame = new SumShapes(); 
      .... 
     } 

    }); 

}