2012-03-25 39 views

Trả lời

7

GridLayout bỏ qua hiệu quả kích thước ưa thích của một thành phần, nhưng bạn có thể kiểm soát aspect ratio bất kỳ thứ gì được vẽ trong paintComponent(), như được hiển thị trong example này. Hình dạng kết xuất vẫn tròn (khía cạnh 1: 1), trong khi (gần) làm đầy thùng chứa ở kích thước hẹp nhất. Thay đổi kích thước khung hình để xem hiệu ứng.

Phụ lục: Ví dụ: tôi đã thêm N * N trường hợp CirclePanel vào GridLayout bên dưới.

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

Cần phải có một cái gì đó mà bạn không có bất kỳ Ví dụ, tôi tự hỏi !!!! :-) –

+0

Tôi là người hâm mộ của [sscce] (http://sscce.org/). :-) – trashgod

+0

OK, vì vậy công cụ phải được thực hiện trong paintComponent. Được chơi xung quanh, vẫn còn havent giải quyết vấn đề. Tại thời điểm này, tôi đang xem xét việc đặt lưới của tôi trong một JPanel trung gian (JPanel -> trung gian JPanel -> GridLayout). Tôi đang cố gắng kiểm soát kích thước của JPanel trung gian này trong paintComponent của JPanel gốc. Bạn cảm thấy sao về việc ấy ? Havent đã làm việc chưa ... – Jerome

Các vấn đề liên quan