entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Resolución Dinámica en JAVA SWING

¿Como puedo hacer para conseguir que una aplicación en JAVA SWING se redimensione de forma dinámica dependiendo de la resolución del pc en cuestión y que se modifique según se cambie?

Gracias por vuestra ayuda :D

3 Respuestas

2votos

xabe Puntos2180

Hola

Aqui tienes un pequeño ejemplo de una aplicación que se adapta al tamaño de la pantalla. Lo más importante es crear un listener para escuchar cuando se produce el evento de cambia la resolución de pantalla.

En concreto en la clase Toolkit.getDefaultToolkit().addAWTEventListener(). Aqui tienes el ejemplo completo.

La clase que es un frame que cambia de tamaño automaticamente.

    import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;

import javax.swing.JFrame;

public class Pantalla extends JFrame {

    private static final long serialVersionUID = 1L;
    private Dimension dimension;

    public Pantalla(Dimension dimension) {
        this.dimension = dimension;
        initcomponents();
    }

    private void initcomponents() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);
        changeSize();
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());
        setTitle("Ejemplo de Pantalla tamaño automatico");
        setExtendedState(JFrame.MAXIMIZED_BOTH);

        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            public void eventDispatched(AWTEvent event) {

                Dimension newScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
                if (newScreenSize.width != dimension.width || newScreenSize.height != dimension.height)
                {                           
                    changeSize();
                }
            }
        }, AWTEvent.PAINT_EVENT_MASK);
    }

    private void changeSize(){
        System.out.println("Nueva tañamo de pantalla ancho : "+dimension.width+" el alto : "+dimension.height);
        setSize(dimension);
    }

}

Ahora la clase que instancia la ventana.

    public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try 
                {

                    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                    Pantalla frame = new Pantalla(screenSize);
                    frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

A ver si esto te sirve.

Saludos

1voto

Yesod comentado

Gracias compañero, voy a mirar a ver como funciona con tu ejemplo y te digo si tengo alguna duda mas :D

Entiendo como funciona, pero...¿Y si quiero meter un par de botones o JtextField? ¿Como se haría entonces?

1voto

white Puntos75820

me temo que tendrias que programar una funcion de acuerdo a tus necesidades, depende que tamaño le quieres dar, un 30% de ancho relativo a la pantalla por ejemplo? te escribo un codigo de ejemplo donde defino el tamaño de la ventana en porcentajes segun el tamaño de la pantalla:

package swing;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.*;

public class Main {
    private static Dimension screenSize = new Dimension();

    public static void ShowGUI()
    {
        JFrame frame = new JFrame("test resize");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setInitialSize(frame, 30, 50);
        centerWindow(frame);

        frame.pack();
        frame.setVisible(true);
    }
    private static void setInitialSize(JFrame frame, double widthPercent, double heightPercent)
    {
        Dimension newSize = new Dimension();

        newSize.setSize(
            ((screenSize.width * widthPercent) / 100),
            ((screenSize.height * heightPercent) / 100)
        );

        frame.setPreferredSize(newSize);
    }
    private static void centerWindow(JFrame frame)
    {
        Rectangle centerBounds = frame.getBounds();

        centerBounds.x = (screenSize.width/2) - (frame.getPreferredSize().width/2);
        centerBounds.y = (screenSize.height/2) - (frame.getPreferredSize().height/2);

        frame.setBounds(centerBounds);
    }
    public static void main(String[] args) {

        screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ShowGUI();
            }
        });
    }

}

le doy un 30% de ancho y 50% de alto de acuerdo a la pantalla.

1voto

cloudman Puntos4020

Yo creo que lo más fácil es utilizar esto en tu clase pantalla.

setExtendedState(JFrame.MAXIMIZED_BOTH);

Con eso te aseguras que la ventana estará maximizada.

Para lo que pides de la redimensión dinámica, utiliza los layouts de SWING, no utilices layout a null porque no conseguirás lo que buscas, el resto de layout cumplen la funcionalidad que pides, y el contenido se adaptará automáticamente.

Yo en las aplicaciones swing que he hecho no he tenido que andar realizando cálculos ni nada por el estilo, con lo que te digo me ha servido perfectamente, hazte una prueba tonta y lo compruebas, redimensiona y verás como se adapta todo.

Un saludo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta