2012-03-15 21 views
6

में एक JFrame पर सरल आयतों ड्राइंग मैं इस तरह JFrame का विस्तार कर रहा हूँ:जावा

public GameFrame() { 
    this.setBounds(30, 30, 500, 500); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    initializeSquares(); 
} 

private void initializeSquares(){ 
    for(int i = 0; i < 5; i++){ 
     this.getContentPane().add(new Square(i*10, i*10, 100, 100)); 
    } 
    this.setVisible(true); 
} 

हालांकि, केवल एक वर्ग स्क्रीन पर तैयार किया जा रहा है, किसी को भी पता है क्यों?

भी मेरे स्क्वायर वर्ग इस तरह दिखता है:

private int x; 
private int y; 
private int width; 
private int height; 
public Square(int x, int y, int width, int height){ 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawRect(x, y, width, height); 
} 

उत्तर

12

JFrame के contentPane डिफ़ॉल्ट रूप से BorderLayout का उपयोग करता है। जब आप इसे स्क्वायर जोड़ते हैं, तो यह डिफ़ॉल्ट BorderLayout.CENTER द्वारा जोड़ा जाता है और किसी भी पहले जोड़े गए स्क्वायर को कवर करता है। आप स्विंग जीयूआई के लिए उपलब्ध सभी लेआउट प्रबंधकों पर पढ़ना चाहेंगे।

उदा के लिए, यहाँ शुरू: Laying Out Components within a Container

लेकिन यह कहा है, मैं कुछ अलग करना चाहते हैं। मैं सिर्फ एक जेपीनेल बनाउंगा और इसे कई वर्गों को पेंट करने में सक्षम बनाउंगा। उदाहरण के लिए कुछ ऐसा:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

public class GameFrame extends JFrame { 
    public GameFrame() { 
     super("Game Frame"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Squares squares = new Squares(); 
     getContentPane().add(squares); 
     for (int i = 0; i < 15; i++) { 
     squares.addSquare(i * 10, i * 10, 100, 100); 
     } 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     new GameFrame(); 
    } 

} 

class Squares extends JPanel { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    private List<Rectangle> squares = new ArrayList<Rectangle>(); 

    public void addSquare(int x, int y, int width, int height) { 
     Rectangle rect = new Rectangle(x, y, width, height); 
     squares.add(rect); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     for (Rectangle rect : squares) { 
     g2.draw(rect); 
     } 
    } 

} 
+0

ठीक है, कि, यह प्रतीत हो रहा है वहाँ एक रास्ता एक लेआउट प्रबंधक का उपयोग नहीं करने के लिए है और सिर्फ निरपेक्ष स्थिति का उपयोग करें? – wbarksdale

+0

आप कंटेनर के लेआउट को 'शून्य' पर सेट करके कर सकते हैं, लेकिन इसकी अनुशंसा नहीं की जाती है। उपरोक्त उदाहरण की तरह कुछ करने के लिए बेहतर है। –

1

पूर्ण स्थिति निर्धारण, कॉल सेटआउट (शून्य) पर कॉल करें। फिर आइकन उनके getLocation() विधि द्वारा लौटाई गई स्थिति पर खींचे जाएंगे, ताकि आप पहले setLocation() को कॉल करना चाहें।

+0

आपको उस से अधिक करने की आवश्यकता होगी क्योंकि आप घटक के स्थान * और * आकार को सेट करने के लिए पूरी तरह उत्तरदायी होंगे। लेकिन फिर, यह अनुशंसित नहीं है। –

0

यहां तक ​​कि मुझे पूर्ण लेआउट i.e लेआउट सेट के साथ एक jframe पर एकाधिक आयताकार प्रदर्शित करते समय भी एक समस्या थी।

JFrame frame = new JFrame("hello"); 
frame.setLayout(null); 
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
frame.setSize(600, 600); 
frame.getContentPane().setBackground(Color.red); 
frame.getContentPane().add(new Square(10,10,100,100));//My rectangle class is similar to the Square mentioned in the question and it extends JComponent. 

फिर भी मैं मुद्दों के रूप में आयत displayed.Unless आप स्पष्ट रूप से सीमा स्क्वायर (JComponent), यह work.Even नहीं होगा पर सेट नहीं था हो रही थी, हालांकि स्क्वायर स्थान निर्माता में पारित कर दिया है, setbounds केवल समस्या को ठीक किया गया है। इसलिए नीचे दिए गए मुद्दे को हल करें और यह समस्या एक पूर्ण लेआउट jframe के लिए है।

Square square = new Square(10,10,100,100); 
square.setBounds(10,10,100,100); 
frame.getContentPane().add(square);