2012-01-13 13 views
5

Desidero posizionare 10 JPanel in un cerchio. Ogni pannello ha le stesse dimensioni e la lunghezza tra due pannelli dovrebbe essere la stessa. Quindi il modo più semplice che ho pensato è quello di afferrare un null-Layout e calcolare il rettangolo di selezione a mano tramite polarcoordiantes:posizione Componenti in cerchio

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

Ma quello non funziona! Alcuni elementi sono sul cerchio, alcuni di loro sono pixel off ... non ho assolutamente idea del perché ?! Non riesco nemmeno a trovare un LayoutManager che possa farlo per me, quindi cosa fare?

+0

Considera la possibilità di creare e pubblicare un [SSCCE] (http://SSCCE.org) che mostra il tuo tentativo e ci fornisce un codice per testare, modificare e eventualmente correggere. –

risposta

5

Il codice è buona, ma hai perso molto importante pezzo di informazione - le funzioni trigonometriche si aspettano gli angoli in radianti nongradi.

Avvolgi la valutazione di phi in Math.toRadians(double) e otterrai il layout che ti aspetti.

(Su un lato nota, ho pensato a come fare qualcosa di simile, grazie per l'esempio)

+0

o phi * (pi/180) :) ahhhh, ho fatto questo errore in gran parte ogni linguaggio di programmazione scritto in: D – reox

6

Mentre X-Zero stava dando la risposta corretta (1+ al suo posto), I creato un 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(); 
     } 
     }); 
    } 
} 

Si prega di accettare la risposta di X-Zero dal suo è stato il primo.

+1

bello, mi piace! – reox

+2

'// TODO: wrap logic in a RadialLayout';) +1 –

+2

Vedere anche [' StarLayout'] (http://mindprod.com/jgloss/starlayout.html), ['CircleTest'] (http: // stackoverflow.com/a/2510048/230513). – trashgod

Problemi correlati