2013-03-03 9 views
7

cześć tam próbuję poprawić się o java2D i przede wszystkim zajmuję się rysowaniem wielokątów. Jednak nie widzę wielokąta w ramce. Przeczytałem kilka tutoriali i przykładów, ale jak powiedziałem, mam problemy. tutaj jest przykładowy kod rysowania wielokąta;o rysowaniu wieloboku w 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(); 

    } 

} 

Odpowiedz

13

JFrame nie posiada metody paintComponent(Graphics g). Dodaj @Override annotation, a otrzymasz błąd czasu kompilacji.

1) Użyj JPanel i zastąpić paintComponent (byś niż dodać JPanel do JFrame viad JFrame#add(..))

2) przesłonić getPreferredSize() powrotu prawidłowych Dimension S, które pasują do Twojego rysunku na obiekcie Graphics albo przyzwyczajenie być postrzegane jako JPanel rozmiar bez składników wynosi 0,0

3) nie wywołać setSize na JFrame ... raczej używać poprawnej LayoutManager i/lub zastąpić getPrefferedSize() i nazywają pack() na JFrame po dodaniu wszystkich składników, ale przed ustawieniem to widoczne

4) Czy odczytu na Concurrency in Swing konkretnie o Event Dispatch Thread

5) oglądać schemat nazewnictwa klasa powinna zaczynać się od litery i każdej pierwszej litery nowego słowa potem powinno być skapitalizowane

6) Również ty extend JFrame i mieć zmienną JFrame? Zabierz extend JFrame i zachować zmienną JFrame jak nie chcemy 2 JFrame S i jej nie dobrej praktyki przedłużyć JFrame chyba dodanie funkcjonalności

Oto kod z powyższych poprawek (jakość obrazu wymówka, ale musiał zmienić rozmiar albo szło 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(); 
      } 
     }); 
    } 
} 

Jak na swój komentarz:

Przygotowuję mapę zawierającą wiele wielokątów, a wczoraj i użyłem JPanela nad ramką JFrame i próbowałem sprawdzić, czy mysz jest wewnątrz wielokąta z MouseListener.później zobaczyłem, że mouseListener dał fałszywych odpowiedzi (jak mysz nie jest wewnątrz wielokąta, ale działa tak jak wewnątrz wielokąta). tak Usunąłem JPanel i to pracował

Tutaj jest aktualizowana kod z MouseAdapter i nadpisane mouseClicked aby sprawdzić, czy kliknięcie było wewnątrz wielokąta.

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

tak naprawdę przygotowuję mapę zawierającą wiele wielokątów, a wczoraj użyłem JPanela nad ramką JFrame i próbowałem sprawdzić, czy mysz znajduje się wewnątrz wielokąta przy pomocy MouseListener. później zobaczyłem, że mouseListener podał fałszywe odpowiedzi (np. mysz nie znajduje się wewnątrz wielokąta, ale działa jak wewnątrz wieloboku). więc usunąłem JPanel, a potem zadziałało. – quartaela

+0

@quartaela Problemem nie było IMO JPanel, to było gdzieś, gdzie –

+0

ok, wtedy spróbuję w ten sposób. mam nadzieję, że zadziała – quartaela

3

JFrame nie rozciąga JComponent więc nie zastępują paintComponent. Możesz to sprawdzić, dodając adnotację @Override.

Aby uzyskać tę funkcjonalność, należy wyodrębnić paintComponent do nowej klasy, która rozszerza się o JComponent. Nie zapomnij zadzwonić pod numer super.paintComponent(g), a nie super.paintComponents(g).

+0

ok, ale tu 'http: // stackoverflow.com/pytania/15167342/ArrayIndexOutOfBoundsException-error-while-rysunek-a-polygon' @camickr mówi, że powinienem użyć paintComponent() jeśli zamierzasz korzystać huśtawka ? – quartaela

+0

Tak, ale to nie powinno być zrobione w kontenerze najwyższego poziomu – Reimeus

0

Wymień

protected void paintComponent(Graphics g){ 

    super.paintComponents(g); 

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

} 

Z

protected void paint(Graphics g){ 

    super.paint(g); 

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

} 
+0

cóż, użyłem metody paint(), ale ktoś powiedział, że jeśli zamierzam użyć huśtawka zamiast rozwagi niż powinienem zastąpić 'paintComponent()' – quartaela

+0

ok teraz mówi Zastanawiam się nad metodą malowania, ale nie pokazuje ona wielokątów – quartaela

Powiązane problemy