2012-03-25 17 views
5

क्या जावा स्विंग में ग्रिडलेआउट घटक के पहलू अनुपात को लॉक करने का कोई आसान तरीका है? या यह उस लेआउट वाले जेपीनल पर किया जाना चाहिए?जावा में ग्रिडलाउट के पहलू अनुपात को कैसे लॉक करें?

उत्तर

7

GridLayout प्रभावी रूप से एक घटक के पसंदीदा आकार पर ध्यान नहीं देता है, लेकिन के रूप में इस example में दिखाया गया है जो कुछ भी, paintComponent() में तैयार की है आप की aspect ratio नियंत्रित कर सकते हैं। प्रस्तुत आकार परिपत्र (1: 1 पहलू) रहता है, जबकि (लगभग) संकीर्ण आयाम में कंटेनर भरना। प्रभाव देखने के लिए फ्रेम का आकार बदलें।

परिशिष्ट: उदाहरण के लिए, मैंने N * NCirclePanel के उदाहरण GridLayout पर दिए गए उदाहरणों को जोड़ा।

enter image description here

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

/** 
* @see https://stackoverflow.com/a/9858355/230513 
* @see https://stackoverflow.com/a/3538279/230513 
*/ 
public class SwingPaint { 

    private static final int N = 4; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setLayout(new GridLayout(N, N)); 
       for (int i = 0; i < N * N; i++) { 
        frame.add(new CirclePanel()); 
       } 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private static class CirclePanel extends JPanel { 

     private static final Random r = new Random(); 

     public CirclePanel() { 
      this.setPreferredSize(new Dimension(80, 80)); 
      this.setForeground(new Color(r.nextInt())); 
      this.addMouseListener(new MouseAdapter() { 

       @Override 
       public void mousePressed(MouseEvent e) { 
        CirclePanel.this.update(); 
       } 
      }); 
     } 

     public void update() { 
      this.setForeground(new Color(r.nextInt())); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Dimension size = this.getSize(); 
      int d = Math.min(size.width, size.height) - 10; 
      int x = (size.width - d)/2; 
      int y = (size.height - d)/2; 
      g.fillOval(x, y, d, d); 
      g.setColor(Color.blue); 
      g.drawOval(x, y, d, d); 
     } 
    } 
} 
+0

वहाँ कुछ है जिसके लिए आप किसी भी उदाहरण के लिए, मुझे आश्चर्य है कि नहीं है हो गया है !!!! :-) –

+0

मैं [एसएससीई] (http://sscce.org/) का प्रशंसक हूं। :-) – trashgod

+0

ठीक है, तो सामग्री पेंट कॉम्पोनेंट में किया जाना चाहिए। चारों ओर खेल रहे थे, अभी भी इस मुद्दे को हल किया है। फिलहाल, मैं अपने ग्रिड को मध्यस्थ जेननेल (जेपीनल -> मध्यवर्ती जेपीनेल -> ग्रिडलाउट) में डाल रहा हूं। मैं जड़ जेननेल के पेंट कॉम्पोनेंट में इस मध्यस्थ जेननेल के आकार को नियंत्रित करने की कोशिश कर रहा हूं। उसके बारे में तुम क्या महसूस कर रहे हो ? हैवेन्ट ने अभी तक काम किया था ... – Jerome

संबंधित मुद्दे