Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema de visualización Swing - Ubuntu raring

Hola, lamento molestarlos nuevamente, pero tengo un molesto problema y no encuentro solución.

Estoy trabajando en Ubutnu raring actualmente, cuando trabajo con JavaFX no hay problema alguno, pero cuando trabajo con Swing tengo un problema que lo describo a continuación.

* Cabe aclarar que de OpenJDK pasé a Oracle JDK para ver si era problema de OpenJDK, pero da el mismo problema.

Programo normalmente (Eclipse Kepler) y cuando quiero lanzar la aplicación, me muestra un frame vacío (aparentemente). Cuando paso el cursos por el área donde están los controles, como botones, éstos se hacen visibles. Para los JTextField, tengo que pasar el cursos por donde están y hacer clic en ellos para que se vean.

Realmente no entiendo por qué pasa esto. En W7/8 no tenía problema alguno.


¿Alguna idea de lo que puede estar causando ésto?


Gracias.

septiembre 28, 2013 | Unregistered CommenterOneBuck

En principio, parece que no estás creando o repintando los componentes de Swing dentro del Event Dispatch Thread.

La manera de iniciar una aplicación en Swing es como sigue:

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Test extends JFrame {

private static final long serialVersionUID = 4_537_504_147_691_728_094L;

public Test() {
initComponents();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jButton1 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.FlowLayout());

jButton1.setText("jButton1");
getContentPane().add(jButton1);

pack();
}// </editor-fold>

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().setVisible(true);
}
});

}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration
}

septiembre 28, 2013 | Registered Commenterchoces

No es por incordiar ;) pero si vas a desarrollar aplicaciones en Swing, tal vez te convendría usar NetBeans https://netbeans.org/index.html

septiembre 28, 2013 | Registered Commenterchoces

Como siempre choces Tus respuestas son excelentes.

Un par de preguntas si no es mucha molestia:

Para qué sirve la instrucción en el main:


ublic static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){

new Login();
}
});
}

¿Es buena técnica al crear una GUI en Swing heredar de JFrame? ¿Algo como ésto se consideraría mala praxis, o es cuestión de gustos?


public final class CenterComponentsDemo {

public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName() );
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch(Exception e){
// nada
}
createAndShowGUI();
}
});
}

private static void createAndShowGUI(){
final JFrame frame = new JFrame("Center Components Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ButtonPane());
frame.setSize(new Dimension(300, 100)); // Done for demo
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private static class ButtonPane extends JPanel{
public ButtonPane(){
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBackground(Color.PINK);
final JButton button = new JButton("Start");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
add(Box.createVerticalGlue());
add(button);
add(Box.createVerticalGlue());
}
}
}


Muchas gracias choces. Un abrazo.

septiembre 28, 2013 | Unregistered CommenterOneBuck

SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
// este bloque de código se ejecuta en el EDT
}
});

Es la manera de asegurar que un bloque de código se ejecute en el thread específico de Swing o de AWT.
Siempre que se crea o se repinta un componente de AWT o Swing debe hacerse dentro del EDT.

Normalmente las aplicaciones con Interfaz de usuario deben tener un JFrame "principal", del que "cuelgan" todos los demás componentes. Pueden crearse además otros JFrame que sirvan de popups, o Window sin frames. Esto último más que cuestión de gustos, depende mucho del análisis de la aplicación.

Mientras se respete la norma del EDT...

septiembre 28, 2013 | Registered Commenterchoces

Clarísimo choces, excelente respuesta.

Muchas gracias por todo, un abrazo.

septiembre 28, 2013 | Unregistered CommenterOneBuck