2012-03-25 2 views

Antwort

7

GridLayout ignoriert effektiv eine bevorzugte Größe der Komponente, aber Sie können die aspect ratio von steuern, was in paintComponent() gezogen wird, wie in diesem example gezeigt. Die gerenderte Form bleibt kreisförmig (1: 1-Aspekt), während sie den Behälter in der engsten Dimension (fast) füllt. Verändern Sie die Größe des Rahmens, um den Effekt zu sehen.

Nachtrag: Zum Beispiel fügte ich Instanzen von CirclePanel zu einem GridLayout unten hinzu.

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

Es muss etwas sein, für die Sie, ich frage mich kein Beispiel haben !!!! :-) –

+0

Ich bin ein Fan von [sscce] (http://sscce.org/). :-) – trashgod

+0

OK, also sollte das in paintComponent gemacht werden. Herum gespielt, immer noch nicht das Problem gelöst. Momentan suche ich mein Raster in einem JPanel (JPanel -> intermediär JPanel -> GridLayout). Ich versuche, die Größe dieses JPanel-Zwischenspeichers in der paintComponent des Root-JPanel zu steuern. Wie fühlst du dich darüber ? Havent hat es schon funktioniert ... – Jerome