¿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
Recibe ayuda de expertos
Es gratis y fácil
Respuestas, votos y comentarios
Recibe puntos, vota y da la solución
¿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
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
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.
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.