Foro sobre Java SE > Perdido
Creas el panel de dibujo en el listener del botón, cada vez que se pulsa el botón, y lo añades a un contenedor con el layout null...
Creo que deberías usar un editor gráfico, como el que usa NetBeans, para irte acostumbrando a manejar Swing correctamente. Lo que haces no tiene ningún sentido.
Saludos
Este es tu código un tanto modificado
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSplitPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Polygon;
import javax.swing.JPanel;
public class PruebaTopo extends JFrame {
public JPanel principalContentPane;
public JPanel areaDibujo;
public JPanel areaBotones;
public JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PruebaTopo frame = new PruebaTopo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public PruebaTopo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 520, 317);
principalContentPane = new JPanel();
principalContentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
GridLayout layout2 = new GridLayout(1,2);
principalContentPane.setLayout(layout2);
setContentPane(principalContentPane);
areaBotones = new JPanel();
areaBotones.setBounds(5, 5, 108, 252);
areaBotones.setLayout(null);
principalContentPane.add(areaBotones);
areaDibujo = new JPanel();
areaDibujo.setBounds(123, 5, 371, 252);
principalContentPane.add(areaDibujo);
// table = new JTable();
// areaDibujo.add(table);
JButton Dibuja = new JButton("Dibuja");
Dibuja.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Graphics graph = areaDibujo.getGraphics();
DibujarPerfil perfil = new DibujarPerfil(graph);
//principalContentPane.add(perfil);
}
});
Dibuja.setBounds(0, 0, 98, 23);
areaBotones.add(Dibuja);
}
}// Fin de la clase
//////////////
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JPanel;
public class DibujarPerfil
{
public DibujarPerfil( Graphics g )
{
// dibuja polígono con objeto polígono
int valoresX[] = { 20, 40, 50, 30, 20, 15 };
int valoresY[] = { 50, 50, 60, 80, 80, 60 };
Polygon poligono1 = new Polygon( valoresX, valoresY, 6 );
g.drawPolygon( poligono1 );
}
}
La primera modificación fue que le apliqué un GridLayout al panel principal para dividir la ventana en dos columnas una con el area de botones y la otra con el area de dibujo.
La otra modificación más importante es que modifiqué la clase DibujarPerfil ya que lo que hacías era añadirle y añadirle paneles al panel principal cada vez que se presionara el botón. Por lo que no vi la necesidad de crear otro panel, ya que para eso ya existe el panel AreaDibujo que es con el que hay que trabajar.
Prueba a ver si es lo que buscas, o me dices y así buscamos otra solución, pues igual que tú estoy aprendiendo.
Muchas gracias!!
No lo entiendo muy bien, pero seguiré estudiando más.
El codigo que publiqué funciona porque lo probé, aunque mirándolo bien, debdería mejorarse en el sentido de que utilicé el constructor de la clase DibujarPerfil para modificar el panel areaDibujo, pero debería mejor usar un método a parte, con otro nombre por supuesto.
Buenas otra vez.
Alguien me podría "interpretar" las líneas de código.
Graphics graph = areaDibujo.getGraphics();
DibujarPerfil perfil = new DibujarPerfil(graph);
La verdad no me aclaro.
Volviendo la burra al prau con mi código parecido al inicial, asumiendo que me creo un panel de dibujo cuando selecciono "Dibujar". No entiendo porque no me dibuja la figura.
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Topo {
private JFrame frmVentanaPrincipal;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Topo window = new Topo();
window.frmVentanaPrincipal.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Topo() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
public void initialize() {
frmVentanaPrincipal = new JFrame();
frmVentanaPrincipal.setTitle("Ventana Principal");
frmVentanaPrincipal.setBounds(100, 100, 590, 389);
frmVentanaPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frmVentanaPrincipal.setJMenuBar(menuBar);
JMenu mnArchivo = new JMenu("Archivo");
menuBar.add(mnArchivo);
JMenuItem mntmDibuja = new JMenuItem("Dibuja");
mntmDibuja.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DibujaPerfil perfil = new DibujaPerfil();
frmVentanaPrincipal.add(perfil);
System.out.println("Coño dibuja");
}
});
mnArchivo.add(mntmDibuja);
JMenuItem mntmSalir = new JMenuItem("Salir");
mntmSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
mnArchivo.add(mntmSalir);
} //Fin de inicializar
}
**************************
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;
public class DibujaPerfil extends JPanel
{
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
g.setColor( Color.BLUE );
g.fillRect( 100, 75, 100, 20 );
g.drawString( "RGB actual: " + g.getColor(), 130, 90 );
}
}
En cambio si
DibujaPerfil perfil = new DibujaPerfil();
frmVentanaPrincipal.add(perfil);
lo pongo fuera del listener dibuja la figura. Si darle a Dibujar, por supuesto.
Gracias de antemano.
Hola a todos, estoy empezando con java y estoy muy perdido.
Agradecería me pudierais ayudar.
Quiero hacer una ventana en la que en la parte izquierda exista una botonera y en la derecha una zona de dibujo.
En la botonera he creado un botón, dibujar perfil.
Pero no consigo que funcione.
El código es el siguiente:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSplitPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JPanel;
public class PruebaTopo extends JFrame {
public JPanel principalContentPane;
public JPanel areaDibujo;
public JPanel areaBotones;
public JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PruebaTopo frame = new PruebaTopo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public PruebaTopo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 520, 317);
principalContentPane = new JPanel();
principalContentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(principalContentPane);
principalContentPane.setLayout(null);
JPanel areaBotones = new JPanel();
areaBotones.setBounds(5, 5, 108, 252);
principalContentPane.add(areaBotones);
areaBotones.setLayout(null);
JButton Dibuja = new JButton("Dibuja");
Dibuja.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
DibujarPerfil perfil = new DibujarPerfil();
principalContentPane.add(perfil);
}
});
Dibuja.setBounds(0, 0, 98, 23);
areaBotones.add(Dibuja);
JPanel areaDibujo = new JPanel();
areaDibujo.setBounds(123, 5, 371, 252);
principalContentPane.add(areaDibujo);
table = new JTable();
areaDibujo.add(table);
}
}// Fin de la clase
//////////////
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JPanel;
public class DibujarPerfil extends JPanel
{
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
// dibuja polígono con objeto polígono
int valoresX[] = { 20, 40, 50, 30, 20, 15 };
int valoresY[] = { 50, 50, 60, 80, 80, 60 };
Polygon poligono1 = new Polygon( valoresX, valoresY, 6 );
g.drawPolygon( poligono1 );
}
}