2012-01-13 10 views
5

Tôi muốn định vị 10 JPanels trong một Vòng kết nối. Mỗi Panel có cùng kích thước và chiều dài giữa hai Panels nên giống nhau. Vì vậy, cách dễ nhất tôi nghĩ là để lấy một null-Bố trí và tính toán các hộp giới hạn bằng tay thông qua polarcoordiantes:vị trí Các thành phần trong vòng tròn

JPanel panel = new JPanel(null); 

int r = 100; 
int phi = 90; 

for (int i = 0; i < 10; i++) { 
    JPanel x = new JPanel(); 
    x.setBackground(Color.red); 
    x.setBounds((int) (r * Math.sin(phi)) + 100, (int) (r * Math.cos(phi)) + 100, 4, 4); 

    panel.add(x); 
    phi = (phi + 36) % 360; 
} 

Nhưng điều đó không hoạt động! Một số mặt hàng đang ở trong vòng tròn, một số trong số đó là các điểm ảnh tắt ... tôi có một ý tưởng blyolutly tại sao ?! Tôi cũng không thể tìm thấy một LayoutManager có thể làm điều đó cho tôi, vì vậy phải làm gì?

+0

Cân nhắc việc tạo và đăng [SSCCE] (http://SSCCE.org) cho thấy nỗ lực của bạn và cung cấp cho chúng tôi một số mã để chúng tôi kiểm tra, sửa đổi và có thể sửa. –

Trả lời

5

Mã của bạn là tốt, nhưng bạn đã bỏ lỡ một phần rất quan trọng của thông tin - hàm lượng giác mong đợi góc trong radiankhôngđộ.

Kết thúc đánh giá phi trong Math.toRadians(double) và bạn sẽ nhận được bố cục mong muốn.

(Trên một mặt lưu ý, tôi đã suy nghĩ về làm thế nào để làm điều gì đó như thế này, nhờ ví dụ)

+0

hoặc phi * (pi/180) :) ahhhh rằng, tôi đã phạm sai lầm này trong hầu hết mọi ngôn ngữ lập trình ive được viết bằng: D – reox

6

Trong khi X-Zero đã đưa ra câu trả lời đúng (1+ bài của mình), tôi đã tạo SSCCE:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.*; 

public class PanelsOnCircle extends JPanel { 
    private static final int RADIUS = 100; 
    private static final int GAP = 20; 
    private static final int PREF_W = 2 * RADIUS + 2 * GAP; 
    private static final int PREF_H = PREF_W; 
    private static final int SLICES = 10; 
    private static final int SIDE = 4; 

    public PanelsOnCircle() { 
     JPanel panel = new JPanel(null); 

     for (int i = 0; i < SLICES; i++) { 
     double phi = (i * Math.PI * 2)/SLICES; 
     JPanel smallPanel = new JPanel(); 
     smallPanel.setBackground(Color.red); 
     int x = (int) (RADIUS * Math.sin(phi) + RADIUS - SIDE/2) + GAP; 
     int y = (int) (RADIUS * Math.cos(phi) + RADIUS - SIDE/2) + GAP; 
     smallPanel.setBounds(x, y, SIDE, SIDE); 

     panel.add(smallPanel); 
     } 

     setLayout(new BorderLayout()); 
     add(panel); 
    } 

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

    private static void createAndShowGui() { 
     PanelsOnCircle mainPanel = new PanelsOnCircle(); 

     JFrame frame = new JFrame("PanelsOnCircle"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Vui lòng chấp nhận câu trả lời của X-Zero từ lần đầu tiên.

+1

đáng yêu, tôi thích nó! – reox

+2

'// TODO: bọc logic trong RadialLayout';) +1 –

+2

Xem thêm [' StarLayout'] (http://mindprod.com/jgloss/starlayout.html), ['CircleTest'] (http: // stackoverflow.com/a/2510048/230513). – trashgod