Foro sobre Java SE > Como crear una JLabel personalizado en la paleta de elementos swing
Buenas,
Yo he cogido tu código tal cual y he podido incluir el PLabel en la paleta y utilizarlo sin problemas en un JFrame.
Me temo que el problema está en:
"He mirado en internet y he visto que hay que hacer la clase y compilarla en .jar y luego meterla en la biblioteca. (Hasta ahí todo bien)"
Tendrás que explicar mejor y en detalle que es lo que has hecho.
Un saludo
Hay algo que no entiendo.
Dices que has creado un label en la paleta de NetBeans, sin embargo: "El código que tengo en la clase PPanel es:..."
Tampoco dices cómo creas ese label desde ese PPanel.
No hace ninguna falta introducir componentes personalizados en la paleta, para poder usarlos. Aparte de que se necesita crear el Beaninfo del componente, y que estén compilados antes de usarlos. Es una incomodidad, y una fuente de errores.
Sigue un test donde puedes comprobar una manera de lograrlo.
Todo el código está generado con el Matisse de NetBeans, excepto tu método traduce.
public class PLabel extends JLabel {
public void traduce(String texto, String ficheroIdioma) {
this.setText("Control.traduce(texto)");
}
}
public class NewJPanel extends javax.swing.JPanel {
/** Creates new form NewJPanel */
public NewJPanel() {
initComponents();
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new PLabel();
setBorder(javax.swing.BorderFactory.createTitledBorder("Este el PPanel"));
jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
jLabel1.setText("Texto");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(204, Short.MAX_VALUE))
);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
// End of variables declaration
}
public class NewJFrame extends javax.swing.JFrame {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new NewJPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(279, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Hola, muchisimas gracias a todos por la ayuda...
Me he equivocado al escribir:
"El código que tengo en la clase PPanel es:"
me refería, "el código que tengo en la clase PLabel es:"
Voy a interpretar todo lo que me habeis puesto que necesitaré un tiempo y os digo algo.
Gracias a todos.
Hola choces,
"No hace ninguna falta introducir componentes personalizados en la paleta, para poder usarlos. Aparte de que se necesita crear el Beaninfo del componente, y que estén compilados antes de usarlos. Es una incomodidad, y una fuente de errores."
Soy nuevo en Java y puede que esté haciendo alguna cosa mal hecha...
Quiero crear un componente personalizado, por la facilidad que tengo para arrastrar encima del JFrame y dejarlo en la posición que quiera, sin tener que estar picando cada vez el código de los contenedores y las posiciones.
Mi problema lo quiero afrontar por partes, pero me he atascado en el primer problema. La finalidad de este componente será que yo cuando arrastre un PLabel y ponga un texto, me lo traduzca al idioma que le pida en tiempo de ejecución en función del idioma del usuario. Esta es la idea. Yo pensaba que la única manera es esta, pero si hay otra manera, agradecería mucho que me des un poco de inspiración, jeje.
Siento mucho haberte liado con lo del PPanel, pero es algo que me gustaría no utilizar porque creo que si lo utilizo, no podré arrastrar directamente el componente, pero puede que aquí también esté equivocado.
Y voy a mirar en internet de que va esto del beaninfo, que la verdad, lo desconozco.
Saludos y muchisimas gracias por todo.
No hay nada equivocado en lo que intentas hacer. Es perfectamente realizable.
Lo que te comentaba es que es una solución más complicada, que insertar directamente en el Editor de NetBeans tus propias extensiones de componentes. De esta manera, tus proyectos no dependen de la paleta de NetBeans, ni de que las clases estén compiladas para poder ser usadas.
http://docs.oracle.com/javase/tutorial/javabeans/writing/beaninfo.html
El Beaninfo te lo genera automáticamente NetBeans. Mira en las propiedades de la clase en cuestión, en el árbol de proyectos.
Hola, ya he encontrado el fallo...
Os estaba dando pistas incompletas involuntariamente.
El problema era, que para poder compilar el componente para exportarlo a la paleta, lo tenía que crear como un proyecto nuevo. Pero esas mismas clases estaban tambien creadas en el proyecto desde el que quería utilizarlo, pero como decía el error, con un constructor diferente con parametros.
Entonces, el componente lo arrastraba correctamente, pero cuando lo quería ejecutar, me utilizaba las clases de dentro de el proyecto principal, y no del compilado.
Muchisimas gracias a todos por vuestro tiempo.
Saludos.
Hola, buenas...
estoy intentando crear un nuevo control en la paleta de netbeans.
Quiero un JLabel personalizado, (llamado PLabel) donde cuando yo inserte un JLabel personalizado, y cambie el texto del JLabel, me mire en un diccionario si esa palabra está y si la tiene que traducir o no.
He mirado en internet y he visto que hay que hacer la clase y compilarla en .jar y luego meterla en la biblioteca. (Hasta ahí todo bien)
El problema es que no soy capaz de que me funcione. Cuando inserto un elemento en un JFrame, me da el error:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - no suitable constructor found for PLabel(no arguments)
constructor Controles.PLabel.PLabel(java.lang.String) is not applicable
(actual and formal argument lists differ in length)
constructor Controles.PLabel.PLabel(java.lang.String,int) is not applicable
(actual and formal argument lists differ in length)
El código que tengo en la clase PPanel es:
import javax.swing.JLabel;
public class PLabel extends JLabel {
public PLabel() {
initComponents();
this.setText("Texto");
}
public void traduce(String texto, String ficheroIdioma){
this.setText("Control.traduce(texto)");
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
}// </editor-fold>
De momento solo quiero poder meter el PLabel en otro JFrame sin que me de el error.
¿Alguna idea?
Muchas gracias.