2013-03-03 63 views
7

hi có tôi đang cố gắng cải thiện bản thân mình về java2D và trước hết tôi đang xử lý các đa giác vẽ. Tuy nhiên, tôi không thể nhìn thấy đa giác trên khung. Tôi đọc một số hướng dẫn và ví dụ nhưng như tôi đã nói tôi phải đối mặt với các vấn đề. đây là mã mẫu vẽ một đa giác;về việc vẽ Đa giác trong java

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Polygon; 

import javax.swing.JFrame; 

public class jRisk extends JFrame { 


    private JFrame mainMap; 
    private Polygon poly; 

    public jRisk(){ 

     initComponents(); 

    } 

    private void initComponents(){ 

     mainMap = new JFrame(); 
     mainMap.setSize(800, 600); 
     mainMap.setResizable(false); 

     mainMap.setVisible(true); 
     mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     int xPoly[] = {150,250,325,375,450,275,100}; 
     int yPoly[] = {150,100,125,225,250,375,300}; 

     poly = new Polygon(xPoly, yPoly, xPoly.length); 

    } 

    protected void paintComponent(Graphics g){ 

     super.paintComponents(g); 

     g.setColor(Color.BLUE); 
     g.drawPolygon(poly); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     new jRisk(); 

    } 

} 

Trả lời

13

JFrame không có một phương pháp paintComponent(Graphics g). Thêm @Override annotation và bạn sẽ gặp lỗi thời gian biên dịch.

1) Sử dụng JPanel và ghi đè paintComponent (bạn sẽ hơn thêm JPanel đến JFrame viad JFrame#add(..))

2) Override getPreferredSize() trở về đúng Dimension s mà phù hợp với bản vẽ của bạn trên đối tượng Graphics hoặc nếu không họ sẽ không được coi là JPanel kích thước mà không cần các thành phần là 0,0

3) không gọi setSize trên JFrame ... thay vì sử dụng một đúng LayoutManager và/hoặc ghi đè getPrefferedSize() và gọi pack() trên JFrame sau khi thêm tất cả các thành phần nhưng trước khi đặt nó có thể nhìn thấy

4) Có một chi trên Concurrency in Swing cụ thể về Event Dispatch Thread

5) xem sơ đồ đặt tên lớp nên bắt đầu với một chữ cái viết hoa và mỗi chữ cái đầu tiên của một từ mới sau đó nên được viết hoa

6) Bạn cũng extend JFrame và có biến số JFrame? Lấy đi extend JFrame và giữ biến JFrame như chúng tôi không muốn 2 JFrame s và thực hành không tốt của mình để mở rộng JFrame trừ việc thêm chức năng

Đây là mã của bạn với các bản sửa lỗi trên (chất lượng hình ảnh cớ nhưng đã phải thay đổi kích thước hoặc nó đang diễn ra đến 800x600):

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Polygon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class JRisk { 

    private JFrame mainMap; 
    private Polygon poly; 

    public JRisk() { 

     initComponents(); 

    } 

    private void initComponents() { 

     mainMap = new JFrame(); 
     mainMap.setResizable(false); 

     mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     int xPoly[] = {150, 250, 325, 375, 450, 275, 100}; 
     int yPoly[] = {150, 100, 125, 225, 250, 375, 300}; 

     poly = new Polygon(xPoly, yPoly, xPoly.length); 
     JPanel p = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.BLUE); 
       g.drawPolygon(poly); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(800, 600); 
      } 
     }; 
     mainMap.add(p); 
     mainMap.pack(); 
     mainMap.setVisible(true); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JRisk(); 
      } 
     }); 
    } 
} 

Theo nhận xét của bạn:

Tôi đang chuẩn bị một bản đồ bao gồm rất nhiều đa giác và ngày hôm qua i đã sử dụng JPanel trên JFrame và tôi đã cố gắng kiểm tra xem con chuột có nằm trong số của đa giác với MouseListener không.sau đó tôi thấy rằng mouseListener đã cho ra các câu trả lời sai (như chuột không nằm trong đa giác nhưng nó hoạt động giống như nó nằm trong đa giác). vì vậy tôi đã xóa JPanel và sau đó nó làm việc

đây được cập nhật mã với MouseAdapter và ghi đè mouseClicked để kiểm tra xem nhấp chuột là trong đa giác.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Polygon; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class JRisk { 

    private JFrame mainMap; 
    private Polygon poly; 

    public JRisk() { 
     initComponents(); 
    } 

    private void initComponents() { 

     mainMap = new JFrame(); 
     mainMap.setResizable(false); 

     mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     int xPoly[] = {150, 250, 325, 375, 450, 275, 100}; 
     int yPoly[] = {150, 100, 125, 225, 250, 375, 300}; 

     poly = new Polygon(xPoly, yPoly, xPoly.length); 

     JPanel p = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.BLUE); 
       g.drawPolygon(poly); 
      } 

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

     MouseAdapter ma = new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent me) { 
       super.mouseClicked(me); 

       if (poly.contains(me.getPoint())) { 
        System.out.println("Clicked polygon"); 
       } 

      } 
     }; 
     p.addMouseListener(ma);//add listener to panel 
     mainMap.add(p); 

     mainMap.pack(); 
     mainMap.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JRisk(); 
      } 
     }); 
    } 
} 
+0

thực sự tôi đang chuẩn bị một bản đồ bao gồm rất nhiều đa giác và ngày hôm qua tôi đã sử dụng JPanel trên JFrame và tôi đã thử kiểm tra xem con chuột có nằm trong đa giác với MouseListener hay không. sau đó tôi thấy rằng mouseListener đã trả lời sai (như chuột không phải là bên trong đa giác nhưng nó hoạt động giống như nó nằm trong đa giác). vì vậy tôi đã xóa JPanel và sau đó nó hoạt động. – quartaela

+0

@quartaela Vấn đề không phải là JPanel IMO nó là nơi khác, nơi –

+0

ok sau đó tôi sẽ cố gắng theo cách này. hy vọng nó sẽ làm việc – quartaela

3

JFrame không mở rộng JComponent như vậy không ghi đè paintComponent. Bạn có thể kiểm tra điều này bằng cách thêm chú thích @Override.

Để lấy chức năng này, hãy trích xuất paintComponent thành một lớp mới mở rộng JComponent. Đừng quên gọi số super.paintComponent(g) thay vì super.paintComponents(g).

+0

ok nhưng ở đây 'http: // stackoverflow.com/câu hỏi/15.167.342/ArrayIndexOutOfBoundsException-lỗi-khi-vẽ-một-polygon' @camickr nói rằng tôi nên sử dụng paintComponent() nếu tôi sẽ sử dụng lung lay ? – quartaela

+0

Có nhưng điều này không nên được thực hiện trong một container cấp cao nhất – Reimeus

0

Thay

protected void paintComponent(Graphics g){ 

    super.paintComponents(g); 

    g.setColor(Color.BLUE); 
    g.drawPolygon(poly); 

} 

Với

protected void paint(Graphics g){ 

    super.paint(g); 

    g.setColor(Color.BLUE); 
    g.drawPolygon(poly); 

} 
+0

tốt tôi đã sử dụng phương pháp paint() tuy nhiên, ai đó nói rằng nếu tôi sẽ sử dụng swing thay vì awt hơn tôi nên ghi đè 'paintComponent()' – quartaela

+0

ok bây giờ nó nói Tuy nhiên, nó không hiển thị đa giác – quartaela

Các vấn đề liên quan