Java - Ayuda con jpanel

 
Vista:

Ayuda con jpanel

Publicado por Marcos (35 intervenciones) el 22/02/2021 19:10:06
Hola, buenas tardes.
Tengo un problema con Jpanel, tengo dos jpanel, al querer mostrar el segundo jpanel no sale ninguno de los componentes que tiene dentro. Nose cual podria ser el problema ya que soy novato trabajando con GUI.
Este es el codigo:

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
public class Clase1 extends JFrame implements ActionListener {
 
    private JPanel contentPane;
    private JTextField txtAgregarJugador;
    private JButton boton1;
    private JPanel panel;
    static ArrayList<String> vectorNombres = new ArrayList<String>();
 
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Clase1 frame = new Clase1();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
 
    }
 
 
    /**
     * Create the frame.
     */
    public Clase1() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(200, 200, 634, 460);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        //contentPane.setBackground(Color.green);
        setContentPane(contentPane);
 
        JTextField txtAgregarJugador = new JTextField();
        //txtAgregarJugador.setBounds(new Rectangle(0, 0, 25, 23));
        //txtAgregarJugador.setEditable(true);
        txtAgregarJugador.setBounds(122, 28, 179, 33);
        txtAgregarJugador.setHorizontalAlignment(SwingConstants.CENTER);
        txtAgregarJugador.setBackground(new Color(192, 192, 192));
        //txtAgregarJugador.setEnabled(false);
        txtAgregarJugador.setFont(new Font("Arial", Font.ITALIC, 13));
        txtAgregarJugador.setText("Nombre jugador");
        txtAgregarJugador.setToolTipText("Agregar jugador");
        txtAgregarJugador.setColumns(10);
 
        boton1 = new JButton("Agregar jugador");
        boton1.setForeground(new Color(255, 0, 255));
        boton1.setBackground(new Color(218, 112, 214));
        boton1.setBounds(new Rectangle(122, 85, 179, 31));
        boton1.setFont(new Font("Trebuchet MS", Font.PLAIN, 11));
        contentPane.setLayout(null);
        contentPane.add(txtAgregarJugador);
        contentPane.add(boton1);
 
        JTextArea textArea = new JTextArea();
        textArea.setBackground(Color.RED);
        //textArea.setForeground(new Color(255, 105, 180));
        textArea.setToolTipText("mostrarJugadores");
        textArea.setBounds(150, 130, 100, 100);
        contentPane.add(textArea);
 
        JButton boton2 = new JButton("Iniciar juego");
        boton2.setBackground(new Color(255, 0, 255));
        //boton2.setForeground(new Color(255, 0, 255));
        boton2.setBounds(318, 219, 108, 33);
        contentPane.add(boton2);
        boton2.addActionListener(this);
 
 
 
        panel = new JPanel();
        //panel.setBounds(0, 0, 436, 252);
        panel.setBorder(new EmptyBorder(5, 5, 5, 5));
        panel.setBackground(Color.RED);
 
 
        JButton boton3 = new JButton("Panel2");
        boton3.setBounds(new Rectangle(122, 85, 179, 31));
        boton3.setBackground(new Color(255, 0, 255));
        panel.add(boton3);
 
        contentPane.setVisible(true);
        panel.setVisible(false);
    }
 
 
 
    public void actionPerformed(ActionEvent e) {
 
        contentPane.setVisible(false);
        panel.setVisible(true);
 
    };
 
 
}

contentPane es el primer panel y panel el segundo, no me muestra el contenido de panel.
De verdad agradeceria que alguien pueda ayudarme
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con jpanel

Publicado por Kabuto (1381 intervenciones) el 23/02/2021 01:57:51
El primer panel, contentPane, es el que estableces como "panel contenedor" del JFrame
1
setContentPane(contentPane);
Es decir, el JFrame va a mostrar lo que esté dentro de este "contenedor.

El segundo panel, no está dentro de este "contenedor". No está asociado de ningún modo al JFrame.
Si su atributo visible es TRUE o FALSE, da igual... no forma parte de JFrame, así que no forma parte de la interfaz gráfica.

Tal vez se podría agregar al contentPane..., pero habría que darle unos bounds... no se, como se comportarían ambos paneles en un mismo contenedor con layout nulo

De hecho, te recomiendo encarecidamente QUE NO USES NUNCA un layout nulo
1
contentPane.setLayout(null);

Es mejor que vayas practicando con los distintos layouts que ofrece Swing: FlowLayout, BoxLayout, GridLayout, BorderLayout, CardLayout,....

Combinando unos con otros y usando distintos paneles, se pueden componer interfaces sin tener que establecer coordenadas fijas con setBounds().
Al principio puede ser algo engorroso cuadrar y colocar las cosas donde uno quiere..., pero cuando te familiarizas con el comportamiento de cada layout, la cosa va mejorando

Usar un layout null, no es recomendable. Al menos no como interfaz principal..., quizás para componer cierto panel, puede ser una opción.... Yo jamás lo he usado, la verdad.. por eso no se muy bien como hacer lo que tú quieres hacer, usando un layout nulo.

Parece que quieres alternar entre dos paneles al pulsar un botón, para esto viene de maravilla el CardLayout, que permite poner dentro de un mismo panel, tantos paneles como quieras, pero de forma que solo uno sea visible.
Como si fuera un mazo de cartas, donde hay varias cartas apiladas pero solo se ve la que está arriba de todo (por eso lo llaman CardLayout)
Luego con una acción de botón, se puede ir pasando de un panel al siguiente, o incluso si quisiéramos, se podría mostrar un panel en concreto, ya que cada panel se añade con un nombre identificativo.

Dejo aquí un ejemplo muy simple, usando un CardLayout para alternar entre dos paneles, pulsando un mismo botón.
Estos dos paneles están dentro de un mismo panel, que es como si fuera el "mazo de cartas".
Este "mazo" se añade al JFrame con un BoxLayout en vertical (eje Y), de modo que debajo de él, quedará otro panel que simplemente contiene el botón que realiza la acción.

No es exactamente lo que querías hacer, pero te puede dar ideas y servir de inspiración.

Fíjate que no hay que especificar setBounds(), ni nada. El botón queda centrado en su espacio, incluso si redimensionamos la ventana con el ratón mientras el programa se está ejecutando.

Por esto digo que es mucho mejor familiarizarse con los layouts y combinarlos, en lugar de usar layout nulo.

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
public class Paneles extends JFrame{
 
	private JPanel panel1;
	private JPanel panel2;
	private JPanel pnCentral;
	private CardLayout grupoPaneles;
	private JButton btCambio;
 
	public Paneles() {
 
		panel1 = new JPanel();
		panel1.setBackground(Color.GREEN);
		panel2 = new JPanel();
		panel2.setBackground(Color.RED);
 
 
		btCambio = new JButton("CAMBIAR");
		btCambio.addActionListener(new AccionCambiar());
 
		grupoPaneles = new CardLayout();
		pnCentral = new JPanel();
		pnCentral.setLayout(grupoPaneles);
		pnCentral.add(panel1, "panel1");
		pnCentral.add(panel2, "panel2");
 
		JPanel pnBoton = new JPanel();
		pnBoton.add(btCambio);
 
		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
 
		add(pnCentral);
		add(pnBoton);
 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300, 300);
		setLocationRelativeTo(null);
		setVisible(true);
 
	}
 
	private class AccionCambiar implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			//El CardLayout pide al panel que contiene paneles, que muestre el siguiente
			grupoPaneles.next(pnCentral);
		}
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Paneles();
			}
		});
	}
 
}
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