ventanas sintaxis propiedades manejo ejemplo caracteristicas java swing jframe jdialog

sintaxis - propiedades de jdialog en java



Ubicación óptima para un JDialog modal para evitar atorarse (4)

La aplicación My Swing debe mostrar un diálogo modal al usuario. Perdón por no publicar SSCCE.

topContainer podría ser JFrame o JApplet .

private class NewGameDialog extends JDialog { public NewGameDialog () { super(SwingUtilities.windowForComponent(topContainer), "NEW GAME", ModalityType.APPLICATION_MODAL); //add components here getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); //TODO: setSize(new Dimension(250, 200)); setLocation(650, 300); } }

Comienzo el diálogo de esta manera en un evento de red

SwingUtilities.invokeLater(new Runnable() { @Override public void run() { NewGameDialog dialog = new NewGameDialog(); dialog.setVisible(true); } });

El problema es establecer una ubicación óptima para mi diálogo.

1) Si se establece como valor absoluto, y muevo el marco de la aplicación a la segunda pantalla, entonces el diálogo se muestra en la primera pantalla, lo cual es extraño.

2) Si se establece un valor relativo para JFrame, podría parecer que el usuario movió el marco de la aplicación fuera de la pantalla y que el diálogo que está relativamente ubicado no sería visible para el usuario. Y debido a que es modal, el juego estaría estancado.

¿Cuál es la mejor solución teniendo en cuenta dos problemas mencionados anteriormente?


Con la ayuda de los 3 contestadores he encontrado un código que parece ser exactamente lo que necesito. Primero, JFrame se colocó en el medio de la pantalla actual y luego JDialog consecuencia.

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) { Rectangle gcBounds = gc[i].getBounds(); Point loc = mainWindow.getLocationOnScreen(); if (gcBounds.contains(loc)) { System.out.println("at " + j + " screen"); int x = gcBounds.x + (gcBounds.width - mainWindow.getWidth()) / 2; int y = gcBounds.y + (gcBounds.height - mainWindow.getHeight()) / 2; mainWindow.setLocation(x, y); int x = loc.getX() + (mainWindow.getWidth() - getWidth()) / 2; int y = loc.getY() + (mainWindow.getHeight() - getHeight()) / 2; setLocation(x, y); break; } } }


utilice JDialog.setLocation () para mover JDialog en el punto deseado en la pantalla

import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; public class JDialogAtPoint { private JFrame frame = new JFrame(); private JPanel panel = new JPanel(); private JDialog dialog; private Point location; public JDialogAtPoint() { createGrid(); createDialog(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(panel); frame.setLocation(100, 100); frame.pack(); frame.setVisible(true); } private void createGrid() { panel.setLayout(new GridLayout(3, 3, 4, 4)); int l = 0; int row = 3; int col = 3; JButton buttons[][] = new JButton[row][col]; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { buttons[i][j] = new JButton(""); buttons[i][j].putClientProperty("column", i + 1); buttons[i][j].putClientProperty("row", j + 1); buttons[i][j].setAction(updateCol()); panel.add(buttons[i][j]); l++; } } } private void createDialog() { dialog = new JDialog(); dialog.setAlwaysOnTop(true); dialog.setModal(true); dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); JPanel pane = (JPanel) dialog.getContentPane(); pane.setBorder(new EmptyBorder(20, 20, 20, 20)); dialog.pack(); } public Action updateCol() { return new AbstractAction("Display JDialog at Point") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { JButton btn = (JButton) e.getSource(); System.out.println("Locations coordinates" + btn.getLocation()); System.out.println("clicked column " + btn.getClientProperty("column") + ", row " + btn.getClientProperty("row")); if (!dialog.isVisible()) { showingDialog(btn.getLocationOnScreen()); } } }; } private void showingDialog(final Point loc) { dialog.setVisible(false); location = loc; int x = location.x; int y = location.y; dialog.setLocation(x, y); Runnable doRun = new Runnable() { @Override public void run() {//dialog.setLocationRelativeTo(frame); dialog.setVisible(true); } }; SwingUtilities.invokeLater(doRun); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JDialogAtPoint cf = new JDialogAtPoint(); } }); } }


Creo que lo mejor sería centrar el diálogo en el medio de la pantalla actual como se describe aquí .

Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension screenSize = toolkit.getScreenSize(); int x = (screenSize.width - d.getWidth()) / 2; int y = (screenSize.height - d.getHeight()) / 2; d.setLocation(x, y);

¿Esto siempre funciona y cómo puede ser invisible para el usuario si está justo en el centro de la pantalla? Y setLocationRelativeTo también se puede usar, pero necesita invocarlo en el momento correcto .


Esto me recordó a mi publicación favorita, usando Window.setLocationByPlatform (true) , en .

Cómo posicionar mejor las GUIs de Swing

EDIT 1:

Puede agregar un FocusListener a su JDialog y en el focusGained(...) , puede usar setLocationRelativeTo(null) para JFrame y JDialog , de modo que ambos lleguen al centro de la pantalla sin importar dónde se encuentren. .

import java.awt.*; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; /** * Created with IntelliJ IDEA. * User: Gagandeep Bali * Date: 1/14/13 * Time: 7:34 PM * To change this template use File | Settings | File Templates. */ public class FrameFocus { private JFrame mainwindow; private CustomDialog customDialog; private void displayGUI() { mainwindow = new JFrame("Frame Focus Window Example"); customDialog = new CustomDialog(mainwindow, "Modal Dialog", true); mainwindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel contentPane = new JPanel(); JButton mainButton = new JButton( "Click me to open a MODAL Dialog"); mainButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!customDialog.isShowing()) customDialog.setVisible(true); } }); contentPane.add(mainButton); mainwindow.setContentPane(contentPane); mainwindow.pack(); mainwindow.setLocationByPlatform(true); mainwindow.setVisible(true); } public static void main(String... args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new FrameFocus().displayGUI(); } }); } } class CustomDialog extends JDialog { private JFrame mainWindow; public CustomDialog(JFrame owner, String title, boolean modal) { super(owner, title, modal); mainWindow = owner; JPanel contentPane = new JPanel(); JLabel dialogLabel = new JLabel( "I am a Label on JDialog.", JLabel.CENTER); contentPane.add(dialogLabel); setContentPane(contentPane); pack(); addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { mainWindow.setLocationRelativeTo(null); setLocationRelativeTo(null); } @Override public void focusLost(FocusEvent e) { /* * Nothing written for this part yet */ } }); } }

EDICION 2:

He buscado un poco aquí y allá, y resulta que, en mi opinión, en realidad, en qué Monitor Screen viene tu aplicación en primera instancia, determinará su configuración de gráficos . Aunque mientras vagaba por la API, solo había un método getter para dicho thingy GraphicsConfiguration y ningún método setter para el mismo (Todavía se puede especificar uno a través del constructor de cualquier nivel superior Window ie JFrame (...) / JDialog ( ...) ).

Ahora puede ocupar su cabeza con este código, que puede usarse para determinar la ubicación adecuada, que desea establecer, nuevamente, puede que tenga que usar el método focusGain() en mi opinión, para satisfacer la condición 2 de su pregunta. Eche un vistazo al código adjunto, aunque no es necesario crear un new JFrame/JDialog , simplemente observe cómo obtener las coordenadas de la pantalla (que puede agregar en el método focusGain() para determinar la ubicación de toda la Aplicación).

GraphicsEnvironment ge = GraphicsEnvironment. getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) { JFrame f = new JFrame(gs[j].getDefaultConfiguration()); Canvas c = new Canvas(gc[i]); Rectangle gcBounds = gc[i].getBounds(); int xoffs = gcBounds.x; int yoffs = gcBounds.y; f.getContentPane().add(c); f.setLocation((i*50)+xoffs, (i*60)+yoffs); f.show(); } }

EDIT 3:

Intenta cambiar esto:

int x = loc.getX() + (mainWindow.getWidth() - getWidth()) / 2; int y = loc.getY() + (mainWindow.getHeight() - getHeight()) / 2; setLocation(x, y);

para sólo :

setLocationRelativeTo(mainWindow);

Para probar lo anterior, utilicé mi FrameFocus Class tal como está, aunque había agregado sus cambios a mi método CustomDialog , como se muestra en esta clase CustomDialog modificada.

class CustomDialog extends JDialog { private JFrame mainWindow; public CustomDialog(JFrame owner, String title, boolean modal) { super(owner, title, modal); mainWindow = owner; JPanel contentPane = new JPanel(); JLabel dialogLabel = new JLabel( "I am a Label on JDialog.", JLabel.CENTER); contentPane.add(dialogLabel); setContentPane(contentPane); pack(); addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { //mainWindow.setLocationRelativeTo(null); //setLocationRelativeTo(null); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) { Rectangle gcBounds = gc[i].getBounds(); Point loc = mainWindow.getLocationOnScreen(); if (gcBounds.contains(loc)) { System.out.println("at " + j + " screen"); int x = gcBounds.x + (gcBounds.width - mainWindow.getWidth()) / 2; int y = gcBounds.y + (gcBounds.height - mainWindow.getHeight()) / 2; mainWindow.setLocation(x, y); //x = (int) (loc.getX() + (mainWindow.getWidth() - CustomDialog.this.getWidth()) / 2); //y = (int) (loc.getY() + (mainWindow.getHeight() - CustomDialog.this.getHeight()) / 2); //CustomDialog.this.setLocation(x, y); CustomDialog.this.setLocationRelativeTo(mainWindow); break; } } } } @Override public void focusLost(FocusEvent e) { /* * Nothing written for this part yet */ } }); } }