2012-01-13 34 views
5

我想在一個圓中放置10個JPanel。每個面板具有相同的尺寸,兩個面板之間的長度應該相同。所以我想最簡單的方法就是抓住一個空的佈局,並通過polarcoordiantes手工計算邊框:位置圈中的組件

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; 
} 

但是,這並不工作!有些項目在圈子上,其中一些是像素關閉...我有一個絕對不知道爲什麼?! 我也找不到可以爲我做的佈局管理器,那該怎麼辦?

+0

考慮創建併發布顯示您的嘗試的[SSCCE](http://SSCCE.org),併爲我們提供一些代碼以供測試,修改並可能更正。 – 2012-01-13 23:11:09

回答

5

你的代碼是好的,但你已經錯過了一個信息非常重要的一塊 - 三角函數預期的角度在弧度

phi的評估包裝在Math.toRadians(double)中,您將得到您期望的佈局。

(在一個側面說明,我一直在思考如何做這樣的事情,感謝您的例子)

+0

或phi *(pi/180):) ahhhh,我在大部分編程語言中都寫過這個錯誤:D – reox 2012-01-13 23:31:30

6

雖然X-Zero的是給正確的答案(1+他的職位),我創建了一個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(); 
     } 
     }); 
    } 
} 

請接受X-Zero自他的第一個答案以來的答案。

+1

可愛,我喜歡它! – reox 2012-01-13 23:32:30

+2

'// TODO:將邏輯放入RadialLayout'中); +1 – 2012-01-14 01:19:20

+2

參見['StarLayout'](http://mindprod.com/jgloss/starlayout.html),['CircleTest'](http:// stackoverflow.com/a/2510048/230513)。 – trashgod 2012-01-14 02:13:52