coordenadas

luis
23 de Junio del 2006
Hola.Queria saber si alguien me puede decir como situar un JFileChooser en unas determinadas coordenadas de la pantalla.¿Con que funciones se haria?Gracias

Orlando
23 de Junio del 2006
Hola.

Normalmente no es posible hacerlo con un JFileChooser sin embargo se puede extender para que permita hacerlo.

A continuación te escribo un ejemplo en el que tendrás un JFrame para asignar la posicion X e Y en la que quieres que te aparezca el JFileChooser:

/---------------------------------------------

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.PosFileChooser;

public class ExamplePosFileChooser extends JFrame {

public ExamplePosFileChooser() {
this.setTitle("Ejemplo PosFileChooser");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setControls();
this.pack();
this.setVisible(true);
}

public static void main(String[] arg) {
new ExamplePosFileChooser();
}

private void setControls() {
lblPosX = new JLabel("Pos X:");
lblPosY = new JLabel("Pos Y:");
txtPosX = new JFormattedTextField();
txtPosX.setColumns(3);
txtPosY = new JFormattedTextField();
txtPosY.setColumns(3);
btnShow = new JButton("Show");
btnShow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showJFileChooser();
}
});
getContentPane().setLayout(new FlowLayout());
getContentPane().add(lblPosX);
getContentPane().add(txtPosX);
getContentPane().add(lblPosY);
getContentPane().add(txtPosY);
getContentPane().add(btnShow);
}

private void showJFileChooser() {
try {
int x = Integer.parseInt(txtPosX.getText());
int y = Integer.parseInt(txtPosY.getText());
//----------------------------------------------------
PosFileChooser fileChooser = new PosFileChooser(x, y);
fileChooser.showOpenDialog(this);
//----------------------------------------------------
} catch(NumberFormatException e) {
JOptionPane.showMessageDialog(
this,
"Debe ingresar valores numéricos para X e Y",
"Ejemplo PosFileChooser",
JOptionPane.WARNING_MESSAGE);
}
}

private JLabel lblPosX;
private JLabel lblPosY;
private JFormattedTextField txtPosX;
private JFormattedTextField txtPosY;
private JButton btnShow;
}

//-----------------------------------------------------

Luego está la clase PosFileChooser que extiende de JFileChooser. Esta clase es identica a JFileChooser salvo que en el contructor especificarás la posición en X e Y.

//----------------------------------------------------

package javax.swing;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.Window;

public class PosFileChooser extends JFileChooser {

int posX;
int posY;

public PosFileChooser(int posX, int posY) {
super();
this.posX = posX;
this.posY = posY;
}

public JDialog createDialog(Component parent) throws HeadlessException {

String title = getUI().getDialogTitle(this);
getAccessibleContext().setAccessibleDescription(title);

JDialog dialog;
Window window = (Window) parent; // <-- OJO
if (window instanceof Frame) {
dialog = new JDialog((Frame)window, title, true);
} else {
dialog = new JDialog((Dialog)window, title, true);
}
dialog.setComponentOrientation(this.getComponentOrientation());

Container contentPane = dialog.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(this, BorderLayout.CENTER);

if (JDialog.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
dialog.getRootPane().setWindowDecorationStyle(JRootPane.FILE_CHOOSER_DIALOG);
}
}
dialog.pack();
dialog.setLocation(posX, posY); // <-- OJO

return dialog;
}
}

//-------------------------------------------------

Espero que te sea de ayuda.

P.D.: Un buen reto!