2013-04-08 9 views
10

के लिए जावा में एक ड्रा आयताकार (काला रंग से भरा) फ़ंक्शन बनाना, मैंने अपने प्रोग्राम में एक ग्रिड बनाया है। नीचे ग्रिड बनाने के लिए इस्तेमाल किया गया कोड है।एक ग्रिड

import java.awt.Graphics; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 

class Grid extends JComponent { 
    public void paint(Graphics g) { 
     g.drawRect (10, 10, 800, 500);  

     for (int i = 10; i <= 800; i+= 10) 
      g.drawLine (i, 10, i, 510); 

     for (int i = 10; i <= 500; i+= 10) 
      g.drawLine (10, i, 810, i); 
    } 
} 

public class CoreControl { 

    public static void main(String[] a) { 
     JFrame window = new JFrame(); 
     window.setSize(840,560); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.getContentPane().add(new Grid()); 
     window.setVisible(true); 
    } 

} 

मुझे क्या करना चाहते हैं एक समारोह जो एक आयत (काले रंग से भरा) निर्देशांक है कि मैं इसे देने के आधार पर आकर्षित करेगा बनाने के लिए है। असल में मैं ग्रिड की कुछ कोशिकाओं को काले रंग के साथ पॉप्युलेट करना चाहता हूं और मेरा विचार सेल निर्देशांक पर काले भरे आयताकारों को आकर्षित करना है। मैं यह कार्य कैसे करूं?

मैंने drawRectangle नामक एक और वर्ग बनाने की कोशिश की और इसे मुख्य समारोह में कहा जैसे खिड़की .getContentPane()। जोड़ें (नया drawRectangle()); हालांकि यह काम नहीं किया (केवल drawRectangle दिखाता है और ग्रिड नहीं)।

मैं भी आयताकार बनाने के लिए बार-बार इस फ़ंक्शन का उपयोग करने में सक्षम होना चाहता हूं।

मैं यह फ़ंक्शन कैसे बना सकता हूं?

यदि आप एक बेहतर तरीका जानते हैं कि मुझे इस कार्यक्रम की संरचना करनी चाहिए तो कृपया मुझे बताएं (मैं जावा में नया हूं इसलिए मैं किसी भी सुझाव के लिए खुला हूं)।

उत्तर

23
  1. paint का उपयोग न करें, paintComponent का उपयोग करें और भूल नहीं है कॉल करने के लिए super.paintComponent
  2. JComponent सबसे अच्छा विकल्प नहीं हो सकता है, JPanel शायद एक बेहतर विकल्प
  3. क्या Graphics#fillRect(int, int, int, int) साथ कुछ गड़बड़ है है?

अधिक जानकारी के लिए आपको Performing Custom Painting और 2D Graphics पर एक नज़र डालना पड़ सकता है।

मैं भरने के लिए दूसरा घटक रखने की कोशिश करने के खिलाफ सलाह दूंगा। सीधे शब्दों में आप ग्रिड वर्ग है कि सेल के x/y स्थिति की आपूर्ति (ग्रिड संदर्भ में) में एक विधि प्रदान करते हैं और paintComponent विधि

उदाहरण

enter image description here

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class CoreControl { 

    public static class Grid extends JPanel { 

     private List<Point> fillCells; 

     public Grid() { 
      fillCells = new ArrayList<>(25); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      for (Point fillCell : fillCells) { 
       int cellX = 10 + (fillCell.x * 10); 
       int cellY = 10 + (fillCell.y * 10); 
       g.setColor(Color.RED); 
       g.fillRect(cellX, cellY, 10, 10); 
      } 
      g.setColor(Color.BLACK); 
      g.drawRect(10, 10, 800, 500); 

      for (int i = 10; i <= 800; i += 10) { 
       g.drawLine(i, 10, i, 510); 
      } 

      for (int i = 10; i <= 500; i += 10) { 
       g.drawLine(10, i, 810, i); 
      } 
     } 

     public void fillCell(int x, int y) { 
      fillCells.add(new Point(x, y)); 
      repaint(); 
     } 

    } 

    public static void main(String[] a) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       Grid grid = new Grid(); 
       JFrame window = new JFrame(); 
       window.setSize(840, 560); 
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.add(grid); 
       window.setVisible(true); 
       grid.fillCell(0, 0); 
       grid.fillCell(79, 0); 
       grid.fillCell(0, 49); 
       grid.fillCell(79, 49); 
       grid.fillCell(39, 24); 
      } 
     }); 
    } 
} 
+1

इस के साथ अपडेट किया भीतर सेल को भरने बेवकूफ लग सकता है लेकिन w/e मैं जावा के लिए नया हूँ। मैं Graphics.fillRect (int, int.int, int) का उपयोग कैसे करूं? अभी यह है कि इसका उपयोग कैसे करना है: फ़ंक्शन drawRectangle (int x1, int y1, int x2, int y2) {Graphics.fillRect (int, int.int, int)} क्या यह संभव है? क्या प्रोग्राम स्वचालित रूप से फ्रेम में आयताकार जोड़ता है? –

+0

संख्या 'fillRect' 'ग्राफिक्स' की एक विधि है, आपको' ग्राफिक्स 'संदर्भ के संदर्भ की आवश्यकता है। सभी पेंटिंग को 'पेंट' विधि (अधिमानतः 'पेंट कॉम्पोनेंट') के संदर्भ में किया जाना चाहिए। आपकी 'ग्रिड' कक्षा में मैं 'fillGrid (int x, int y)' जैसी कुछ विधि प्रदान करता हूं जो आपको बताता है कि कौन सा सेल भरना है। आपके 'पेंट कॉम्पोनेंट' विधि में, मैं इस सेल के आयताकार सीमाओं को निर्धारित करता हूं और 'fillRect' (ps मैंने जवाब अपडेट किया है;) का उपयोग करके भरें) – MadProgrammer

+0

ठीक है तो fillRect का परीक्षण करने के लिए मैंने सार्वजनिक शून्य रंग जोड़ा है (ग्राफिक्स जी , int x, int y) { \t g.fillRect (x, y, 10, 10); ग्रिड क्लास में }। मैं इस फ़ंक्शन का उपयोग कैसे करूं? –