2012-03-25 18 views

risposta

7

GridLayout ignora efficacemente dimensione preferita di un componente, ma è possibile controllare la aspect ratio di tutto ciò che è disegnato in paintComponent(), come mostrato in questo example. La forma renderizzata rimane circolare (aspetto 1: 1), mentre (quasi) riempie il contenitore nella dimensione più stretta. Ridimensiona la cornice per vedere l'effetto.

Addendum: Ad esempio, ho aggiunto N * N istanze di CirclePanel a GridLayout di seguito.

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

Ci deve essere qualcosa per cui non si dispone di alcun esempio, mi chiedo !!!! :-) –

+0

Sono un fan di [sscce] (http://sscce.org/). :-) – trashgod

+0

OK, quindi roba dovrebbe essere fatto in paintComponent. Mi sono divertito, non ho ancora risolto il problema. Al momento, sto cercando di inserire la mia rete in un JPanel intermedio (JPanel -> intermedio JPanel -> GridLayout). Sto cercando di controllare la dimensione di questo JPanel intermedio nel paintComponent della radice JPanel. Come ti senti a riguardo? Havent ha funzionato ancora ... – Jerome

Problemi correlati