Java - Posicionar botones en circulo

 
Vista:

Posicionar botones en circulo

Publicado por Eduviduvidu (3 intervenciones) el 19/01/2015 14:03:24
Hola, estoy haciendo un proyecto para clase, tenemos que hacer un juego al estilo triviados, y me he encontrado con el problema del tablero, los botones se encuentran posicionados en forma de circulo, y no quería hacer la porquería de ponerlos uno a uno , alguien sabría como hacer esto? Gracias de antemano!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

Posicionar botones en circulo

Publicado por Jhonnathan Emilio Cardona Saineda (328 intervenciones) el 19/01/2015 20:33:00
Hola, normalmente para adicionar botones, label, textfield entre otros controles graficos se utilizan ciclos.
Te dejo un ejemplo

http://jagonzalez.org/arreglo-de-botones-en-java/


Espero te sirva,
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Posicionar botones en circulo

Publicado por Eduviduvidu (3 intervenciones) el 20/01/2015 11:01:30
Hola, esto ya lo tenia hecho, aunque gracias de todos modos.
El problema es que no se como poner los botones, de manera que queden en circulo, he conseguido algo parecido aunque erróneo utilizando las cuerdas de un circulo, abajo dejo el link.
http://es.wikipedia.org/wiki/Cuerda_%28geometr%C3%ADa%29

El problema de utilizar esto es que las cueras dejan la misma separacion por la parte de x(en mi caso), pero la parte de y quedan separaciones distintas. dejo el código y una muestra del Frame.

Espero que con esta aclaracion se entienda mejor mi problema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class Vista extends JFrame {
 
    Point center;
 
    public Vista() {
        /* Dejamos en null el layout, ya que queremos situar los botones de 
         * manera absoluta, por lo que cualquier layout molestaria 
         * a la hora de crear los botones
         */
        this.setLayout(null);
        //Ponemos el tamaño que queremos del JFrame
        this.setMinimumSize(new Dimension(700, 700));
        //Genera un punto en el medio.
        center = new Point(this.getHeight() / 2, this.getWidth() / 2);
        //Llamamos al metodo crearBotones
        crearBotones();
        this.setVisible(true);
    }
 
    public void crearBotones() {
        JButton b;
 
        /* 
         * Genera el radio de la circunferencia, 
         * comprovando el tamaño de la ventana y dejando un margen de 150 pixels
         */
        int radioCircunferencia = (this.getHeight() / 2) - 150;
        if (this.getWidth() > this.getHeight()) {
            radioCircunferencia = (this.getWidth() / 2) - 150;
        }
 
        //Numero de cuerdas a generar.
        int cuerdas = 16;
        // Guarda el tamaño entre cuerda y cuerda.
        int distanciaCuerdas = radioCircunferencia / cuerdas;
 
        // Los for generan un cuarto de la circunferencia cada uno, .
        /**
         * En el for sumamos la distancia entre las cuerdas hasta que consigamos
         * llegar al radio de la circunferencia
         */
        for (int i = distanciaCuerdas; i <= radioCircunferencia; i += distanciaCuerdas) {
            // Guarda la posicion de x del boton que va a generar en cada ejecucion
            int posXBoton = center.x + i;
 
            /* Guarda la posicion de y del boton que va a generar en cada 
             * ejecucion, este valor se genera utilizando Pitagoras
             */
            int posYBoton = center.y
                    + ((int) Math.sqrt(Math.pow(radioCircunferencia, 2)
                            - (int) Math.pow(i, 2)));
            //Crea el boton con el nombre "1"
            b = new JButton("1");
 
            //Posiciona el botón en la posicion x e y del frame
            b.setBounds(posXBoton, posYBoton, 20, 20);
 
            // Pone el boton visible y lo añade al frame
            b.setVisible(true);
            this.add(b);
        }
    }
}

El código es algo lioso, por lo que si tenéis alguna duda intentaré explicarla de la forma mas correcta que pueda.

El resultado de ejecutar el codigo es el siguiente, como podeis ver la distancia entre los botones por parte del eje y es diferente, pero es normal teniendo en cuenta el calculo que he utilizado.
thump_9247265captura
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Posicionar botones en circulo

Publicado por Tom (1831 intervenciones) el 20/01/2015 12:51:26
Trigonometría.
Lógicamente, la separación horizontal y/o vertical entre botones _no_ puede constante, estamos hablando de una circunferencia (lo que es constante es la distancia entre los puntos centrales de cada botón).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Buttons extends JFrame {
	/* */
	Buttons() {
		super("Prueba Botones");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(createPanel(60));
		pack();
	}
	/* */
	JPanel createPanel(int count) {
		JPanel p = new JPanel();
		p.setLayout(null);
		p.setPreferredSize(new Dimension(800, 800));
		p.setSize(p.getPreferredSize());
		double arcTotal = Math.PI * 2.0;
		double arcButton = arcTotal / count;
		double radio = (800.0 / 2.0) - 64.0;
		int centerX = 400, centerY = 400;
		Font fb = new Font("Monospace", Font.PLAIN, 8);
		Insets margin = new Insets(1, 1, 1, 1);
 
		for(int i = 0; i < count; i++) {
			double x = radio * Math.cos(i * arcButton);
			double y = radio * Math.sin(i * arcButton);
			JButton bt = new JButton(Integer.toString(i));
			bt.setFont(fb);
			bt.setMargin(margin);
			p.add(bt);
			bt.setBounds((int)x + centerX - 12, (int)y + centerY - 12, 24, 24);
		}
		return p;
	}
	/* */
	public static void main(String[] args) {
		new Buttons().setVisible(true);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Posicionar botones en circulo

Publicado por Eduviduvidu (3 intervenciones) el 20/01/2015 15:24:27
Muchisimas grácias, es justo lo que necesitava!!
Era mas un problema matemático que de programación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Posicionar botones en circulo

Publicado por Tom (1831 intervenciones) el 20/01/2015 16:48:01
Con esto, sí que quedan uniformes los botones, dándoles forma circular :) Es un poco chapucero, pero como idea, vale:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
JPanel createPanel(int count) {
		Border bb = new RoundBorder();
...
...
		for(int i = 0; i < count; i++) {
 
			JButton bt = new JButton(Integer.toString(i));
			bt.setContentAreaFilled(false);
...
...
			bt.setBorder(bb);
			p.add(bt);
			bt.setBounds((int)x + centerX - 13, (int)y + centerY - 13, 27, 27);
		}
		return p;
	}
 
 
	/* */
	class RoundBorder extends AbstractBorder {
		@Override
		public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
			Graphics2D g2 = (Graphics2D)g;
			Paint	save = g2.getPaint();
			g2.setPaint(Color.blue.brighter());
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.drawOval(x, y, width - 1, height - 1);
			g2.setPaint(save);
		}
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar