2014-12-31 2 views
1

Java에서 paint()repaint()으로 바꿀 수있는 기능이 있습니까?페인트 및 페인트 다시 칠하기 기능은 무엇입니까?

시나리오가 있습니다.

삼각형 (삼각형 1)이 있습니다. 사용자가 삼각형을 클릭하면 다른 삼각형 (삼각형 2)이 표시되고 (삼각형 1)이 화면에서 제거됩니다. (JFrame, paint()repaint()을 사용하여 코딩 됨)

나는 그것을 지금까지 달성했다. 하지만 문제는 마우스를 사용하여 창 크기를 최소화하거나 변경하면 출력 창이 다시 그려집니다. 트라이앵글 1 트라이앵글 2이 아닌 트라이앵글 1입니다. 또는 지우기 내가 g2d.clearRect(0, 0, 1000, 1000);
triangle.reset();

주 호출하면 전체 화면 :이 두 기능은 (트라이앵글 1) 이전 삼각형을 제거 할 수 있습니다.

최소화 또는 창 크기가 변경 될 때 상태를 변경해서는 안되는 기능이 있습니까?

또는 repaint() 또는 시나리오에 도움이되는 사항을 무시할 수 있습니다.

다음은 작업 코드입니다. 그것을 실행하고 삼각형을 클릭 한 다음 최소화하고 다시보십시오. 문제가 더 명확하게 나타납니다.

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

public class Triangle_shape extends JFrame implements ActionListener { 

    public static JButton btnSubmit = new JButton("Submit"); 

    public Triangle_shape() { 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setLayout(new BorderLayout()); 
     frame.add(new TrianglePanel(), BorderLayout.CENTER); 
     frame.add(btnSubmit, BorderLayout.PAGE_END); 
     frame.pack(); 
     frame.repaint(); 
     frame.setTitle("A Test Frame"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public static class TrianglePanel extends JPanel implements MouseListener { 

     private Polygon triangle, triangle2; 

     public TrianglePanel() { 
      //Create triangle 
      triangle = new Polygon(); 
      triangle.addPoint(400, 550);  //left 
      triangle.addPoint(600, 550); //right 
      triangle.addPoint(500, 350); //top 

      //Add mouse Listener 
      addMouseListener(this); 

      //Set size to make sure that the whole triangle is shown 
      setPreferredSize(new Dimension(300, 300)); 
     } 

     /** 
     * Draws the triangle as this frame's painting 
     */ 
     @Override 
     public void paintComponent(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.draw(triangle); 
     } 

     //Required methods for MouseListener, though the only one you care about is click 
     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 

     /** 
     * Called whenever the mouse clicks. Could be replaced with setting the 
     * value of a JLabel, etc. 
     */ 
     public void mouseClicked(MouseEvent e) { 
      Graphics2D g2d = (Graphics2D) this.getGraphics(); 
      Point p = e.getPoint(); 
      if (triangle.contains(p)) { 
       System.out.println("1"); 

       g2d.clearRect(0, 0, 1000, 1000); 
       triangle.reset(); 
       g2d.setColor(Color.MAGENTA); 
       triangle2 = new Polygon(); 
       triangle2.addPoint(600, 550); // left 
       triangle2.addPoint(700, 350); //top 
       triangle2.addPoint(800, 550); //right 
       g2d.draw(triangle2); 
      } else { 
       System.out.println("Triangle dont have point"); 
      } 
     } 
    } 
} 
+1

짧은 대답은 아니오이며 시도하지 마십시오. API 내에서 작업하면 머리카락이 생깁니다. – MadProgrammer

+1

작업 코드가 업데이트되었습니다. 다시 보시기 바랍니다. 감사합니다. –

+0

나는이 머리 나 꼬리를 만들 수 없습니다. 'paint()'또는'repaint()'메소드에 대한 대안은 없으며, 이것들은 서로 동등하거나 대체 할 수 없습니다. – EJP

답변

2

paint()repaint() 잘 작동하지만, 그들이 사용하도록 설계로 당신이 그들을 사용하고 있지 않습니다. 창 시스템은 구성 요소의 모양을 지속적으로 유지하지 않습니다. 구성 요소가 창 크기를 조정하거나 최소화하지 않은 경우와 같이 필요할 때 전체 모양을 다시 칠할 수 있어야합니다.

그래픽 개체를 getGraphics()으로 잡고 구성 요소에 무언가를 그릴 경우 전체 구성 요소를 다시 그리기해야하는 경우 무언가를 그릴 수 있습니다. 따라서 그렇게하지 말고 paintComponent 메소드에 필요한 모든 정보가 으로 완전하게에 다시 그려져 있는지 확인하십시오.


화면에서 한 번에 삼각형 만 사용하려는 경우 별도의 변수 triangle2을 생성하지 마십시오.그냥 다음과 같이 마우스 클릭 핸들러를 변경하여 당신이 가지고있는 하나 개의 삼각형을 대체 :

public void mouseClicked(MouseEvent e) { 
    Point p = e.getPoint(); 
    if (triangle.contains(p)) { 
     triangle = new Polygon(); 
     triangle.addPoint(600, 550); // left 
     triangle.addPoint(700, 350); //top 
     triangle.addPoint(800, 550); //right 
     repaint(); 
    } else { 
     System.out.println("Point not in triangle"); 
    } 
} 

귀하의 paintComponent 방법은 배경이 그려진 수 있도록 super.paintComponent를 호출해야하지만, 그렇지 않으면 당신은 그것을 변경할 필요가 없습니다 :

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.draw(triangle); 
} 

또는 화면에 여러 개의 삼각형을 유지하려는 경우 (예 : 클릭 할 때마다 새 삼각형을 추가하려는 경우)

을 그릴 때마다 그려지는 모양의 list에 추가해야합니다.
private final List<Shape> shapes = new ArrayList<>(); 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 
    for (Shape s : shapes) 
     g2d.draw(s); 
} 

그런 다음 화면에있는 모양 집합을 제어하려면 목록의 내용을 조작하고 repaint();을 호출하십시오.

예를 들어, 화면에 사람에 새 모양을 추가합니다 :

Polygon triangle = new Polygon(); 
triangle.addPoint(200, 300); 
triangle.addPoint(200, 200); 
triangle.addPoint(300, 200); 
shapes.add(triangle); 
repaint(); 

화면에서 모든 모양을 제거하려면 :

shapes.clear(); 
repaint(); 

또한 확인해야 당신이 메인 스레드에서 Swing 구성 요소와 상호 작용하는 것은 안전하지 않기 때문에 프로그램 시작시 스윙 스레드로 전환하십시오. main에서 :

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame(); 
      . 
      . 
      . 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

'public void paintComponent (Graphics g) {..}는'public void paintComponent (Graphics g)이어야합니다. {super.paintComponent (g); .. ' –

+0

@AndrewThompson OP는 컴포넌트의 전체 모양을 그려야하고, 기본 텍스트를 그릴 수 없으므로 super.paintComponent를 호출하지 않는 것이 좋습니다. – Boann

+0

* "그것은 소리가납니다."* 그 구성 요소에 경계선이 없거나 우연히 BG가 채워지는 것처럼 보이지 않는 것처럼 들리니? 이러한 것들을 추정하지 않는 것이 가장 좋습니다. –

2

귀하의 mouseClicked 방법은 새로운 삼각형 개체를 만들 수 없습니다한다. 재설정 후 그냥 그것에 새 포인트를 추가합니다. 또한이 방법으로 그릴 수 있지만 repaint를 호출하지 않습니다

public void mouseClicked(MouseEvent e) { 
     Point p = e.getPoint(); 
     if (triangle.contains(p)) { 
      System.out.println("1"); 
      triangle.reset();   // change the current triangle 
      triangle.addPoint(600, 550); // new left 
      triangle.addPoint(700, 350); // new top 
      triangle.addPoint(800, 550); // new right 
      repaint();     // force repainting 
     } else { 
      System.out.println("Triangle dont have point"); 
     } 
    } 

을 이제 많은 삼각형을 원하는 경우 Polygon의 모음이 있어야합니다. 이와 같이 :

public static class TrianglePanel extends JPanel implements MouseListener { 
    private Vector<Polygon> triangles; 

    public TrianglePanel() { 
     n = 0; 
     // Create an empty collection 
     triangles = new Vector<Polygon>(); 

     //Create first triangle 
     Polygon triangle = new Polygon(); 
     triangle.addPoint(400, 550); //left 
     triangle.addPoint(600, 550); //right 
     triangle.addPoint(500, 350); //top 

     // Add the triangle to the collection 
     triangles.add(triangle); 

     //Add mouse Listener 
     addMouseListener(this); 

     //Set size to make sure that the whole triangle is shown 
     setPreferredSize(new Dimension(300, 300)); 
    } 

    /** 
    * Draws the triangles as this frame's painting 
    */ 
    @Override 
    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     for (Polygon p : triangles) // Draw all triangles in the collection 
      g2d.draw(p); 
    } 

    //Required methods for MouseListener, though the only one you care about is click 
    public void mousePressed(MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 

    /** 
    * Called whenever the mouse clicks. Could be replaced with setting the 
    * value of a JLabel, etc. 
    */ 
    public void mouseClicked(MouseEvent e) { 
     Graphics2D g2d = (Graphics2D) this.getGraphics(); 
     Point p = e.getPoint(); 
     // Do what you want with p and the collection 
     // For example : remove all triangles that contain the point p 
     ListIterator<Polygon> li = triangles.listIterator(); 
     while (li.hasNext()) { 
      if (li.next().contains℗) li.remove(); 
     } 
     // Do what you want to update the list 
     // For example: Add a new triangle... 
     Polygon triangle = new Polygon(); 
     triangle.addPoint(600+n, 550); // left 
     triangle.addPoint(700+n, 350); //top 
     triangle.addPoint(800+n, 550); //right 
     triangles.add(triangle); // add the new triangle to the list 
     n += 10; // next new triangle will be "moved" right 
     repaint(); 
    } 
    private int n; 
} 
+0

이것은 1 대 1 삼각형에 대해 사실 일 수있다. 그러나 1 대 다수를해야한다면? 1 3을 뽑고 그립니다. –

+0

그에 따라 대답을 수정합시다 ... –

+0

나는 코드를 시험해 보았습니다. 최소화 한 다음 화면을 최소화하지 않을 때. 삼각형이 사라졌습니다 .. 그것은 전에 직면했던 것과 같은 문제가 있음을 의미합니다. –

관련 문제