У меня есть JDialog, вызываемый из JFrame. Этот Jdialog загружает некоторые данные, переданные из jframe. Я могу загрузить все данные в порядке, кроме изображения. Я передаю это изображение в строку, в которой у меня есть путь, и загружаю его с помощью метода (cargarImagen ()).

Это код JDialog:

public class ContactoMantenimiento extends JDialog {

/**
 * 
 */
private static final long serialVersionUID = 6291928431785031824L;

ContactoJDBCImpl cc= new ContactoJDBCImpl();

private Contacto c;
private final JPanel contentPanel = new JPanel();
private JTextField txId;
private JTextField txNombre;
private JTextField txApellido1;
private JTextField txApellido2;
private JTextField txTelefono;
private JTextField txDireccion;
private JTextField txCp;
private JTextField txCiudad;
private JTextField txEmail;
private JTextField txFecha;
private JLabel     lblImagen;
private JTextField txFoto;
/**
 * Launch the application.
 */
public static void main(String[] args) {
    try {
        ContactoMantenimiento dialog = new ContactoMantenimiento();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Create the dialog.
 */
public ContactoMantenimiento() {

    setModal(true);

    setBounds(100, 100, 588, 300);
    getContentPane().setLayout(new BorderLayout());
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.CENTER);
    contentPanel.setLayout(new BorderLayout(0, 0));
    {
        JPanel panel = new JPanel();
        contentPanel.add(panel, BorderLayout.CENTER);
        panel.setLayout(new FormLayout(new ColumnSpec[] {
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.DEFAULT_COLSPEC,
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.DEFAULT_COLSPEC,
                FormSpecs.RELATED_GAP_COLSPEC,
                ColumnSpec.decode("default:grow"),
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.DEFAULT_COLSPEC,
                FormSpecs.RELATED_GAP_COLSPEC,
                ColumnSpec.decode("default:grow"),
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.DEFAULT_COLSPEC,
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.GROWING_BUTTON_COLSPEC,
                FormSpecs.RELATED_GAP_COLSPEC,
                FormSpecs.DEFAULT_COLSPEC,},
            new RowSpec[] {
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                RowSpec.decode("6dlu"),
                FormSpecs.DEFAULT_ROWSPEC,
                FormSpecs.RELATED_GAP_ROWSPEC,
                FormSpecs.DEFAULT_ROWSPEC,}));
        {
            JLabel lblId = new JLabel("Id");
            panel.add(lblId, "4, 4, right, default");
        }
        {
            txId = new JTextField();
            txId.setEditable(false);
            panel.add(txId, "6, 4, fill, default");
            txId.setColumns(10);
        }
        {
            JLabel lblDireccin = new JLabel("Dirección");
            panel.add(lblDireccin, "8, 4, right, default");
        }
        {
            txDireccion = new JTextField();
            panel.add(txDireccion, "10, 4, fill, default");
            txDireccion.setColumns(10);
        }
        {
            lblImagen = new JLabel("");
            panel.add(lblImagen, "14, 4, 1, 7");
        }
        {
            JLabel lblNombre = new JLabel("Nombre");
            panel.add(lblNombre, "4, 6, right, default");
        }
        {
            txNombre = new JTextField();
            panel.add(txNombre, "6, 6, fill, default");
            txNombre.setColumns(10);
        }
        {
            JLabel lblCdigoPostal = new JLabel("Código postal");
            panel.add(lblCdigoPostal, "8, 6, right, default");
        }
        {
            txCp = new JTextField();
            panel.add(txCp, "10, 6, fill, default");
            txCp.setColumns(10);
        }
        {
            JLabel lblPrimerApellido = new JLabel("Primer apellido");
            panel.add(lblPrimerApellido, "4, 8, right, default");
        }
        {
            txApellido1 = new JTextField();
            panel.add(txApellido1, "6, 8, fill, default");
            txApellido1.setColumns(10);
        }
        {
            JLabel lblCiudad = new JLabel("Ciudad");
            panel.add(lblCiudad, "8, 8, right, default");
        }
        {
            txCiudad = new JTextField();
            panel.add(txCiudad, "10, 8, fill, default");
            txCiudad.setColumns(10);
        }
        {
            JLabel lblSegundoApellido = new JLabel("Segundo apellido");
            panel.add(lblSegundoApellido, "4, 10, right, default");
        }
        {
            txApellido2 = new JTextField();
            panel.add(txApellido2, "6, 10, fill, default");
            txApellido2.setColumns(10);
        }
        {
            JLabel lblTelfono = new JLabel("Teléfono");
            panel.add(lblTelfono, "8, 10, right, default");
        }
        {
            txTelefono = new JTextField();
            panel.add(txTelefono, "10, 10, fill, default");
            txTelefono.setColumns(10);
        }
        {
            JLabel lblFechaNacimiento = new JLabel("Fecha nacimiento");
            panel.add(lblFechaNacimiento, "4, 12, right, default");
        }
        {
            txFecha = new JTextField();
            panel.add(txFecha, "6, 12, fill, top");
            txFecha.setColumns(10);
        }
        {
            JLabel lblEmail = new JLabel("Email");
            panel.add(lblEmail, "8, 12, right, default");

        }
        {
            txEmail = new JTextField();
            panel.add(txEmail, "10, 12, fill, default");
            txEmail.setColumns(10);
        }
        {
            txFoto = new JTextField();
            txFoto.setEditable(true);
            panel.add(txFoto, "14, 14, fill, top");
            txFoto.setColumns(10);
        }
        {
            JButton btnCambiar = new JButton("Cambiar imagen");
            btnCambiar.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {

                    String path = buscarImagen();
                    cargarImagen(path);

                }
            });
            panel.add(btnCambiar, "14, 12");
        }

    }
    {
        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        {
            JButton btAceptar = new JButton("Aceptar");
            btAceptar.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {

                    Boolean correcto = false;
                    String id= txId.getText();
                    Contacto c = new Contacto();
                    Date fecha=null;
                    fecha = parseFecha (txFecha.getText());

                    if (txId.getText().length()>0){
                        c.setIdContacto(Integer.parseInt(txId.getText()));
                    }
                    c.setNombre(txNombre.getText());
                    c.setApellido1(txApellido1.getText());
                    c.setApellido2(txApellido2.getText());
                    c.setDireccion(txDireccion.getText());
                    c.setCp(txCp.getText());
                    c.setCiudad(txCiudad.getText());
                    c.setEmail(txEmail.getText());                                      
                    c.setFechaNacimiento(fecha);
                    c.setTelefono(txTelefono.getText());                                                
                    c.setFoto(txFoto.getText());

                    if(id.equalsIgnoreCase("")){

                        correcto = cc.insertarContacto(c);

                    }else{

                        correcto = cc.actualizarContacto(c);

                    }
                    if (!correcto){

                        JOptionPane.showMessageDialog(getParent(), "Error al actualizar la base de datos" );

                    }else{

                        JOptionPane.showMessageDialog(getParent(), "Base de datos actualizada" );
                    }
                    dispose();

                }
            });
            btAceptar.setActionCommand("OK");
            buttonPane.add(btAceptar);
            getRootPane().setDefaultButton(btAceptar);
        }
        {
            JButton btCancelar = new JButton("Cancelar");
            btCancelar.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    dispose();
                }
            });
            btCancelar.setActionCommand("Cancel");
            buttonPane.add(btCancelar);
        }
    }


}

public Contacto getContacto(){

    return this.c;

}

public void setContacto (Contacto c){

    this.c= c;

}
/*
 * 
 * Método que convierte un string en una fecha con el formato requerido
 */
public Date parseFecha(String fecha){

    Date fechaDate = null;
    SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

    try {
        fechaDate = formato.parse(fecha);

    } 
    catch (ParseException ex) 
    {
        System.out.println(ex);
    }
    return fechaDate;
}
/**
 * Método que carga los datos al inicio
 */
public  void cargarDatos(Contacto cs){

    //Rellenamos los datos del formulario

    txId.setText(Integer.toString(cs.getIdContacto()));
    txNombre.setText(cs.getNombre());
    txApellido1.setText(cs.getApellido1());
    txApellido2.setText(cs.getApellido2());
    txTelefono.setText(cs.getTelefono());
    txDireccion.setText(cs.getDireccion());
    txCp.setText(cs.getCp());
    txCiudad.setText(cs.getCiudad());
    txEmail.setText(cs.getEmail());
    txFecha.setText(formatearFecha(cs.getFechaNacimiento()));
    txFoto.setText(cs.getFoto());

    //Mostramos la imagen
    cargarImagen(txFoto.getText());

}

String formatearFecha (Date fecha){
    String ff;
    SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
    ff=sdf.format(fecha);

    return ff;
}

@SuppressWarnings("static-access")
public String buscarImagen(){

    JFileChooser jfc = new JFileChooser();
    FileNameExtensionFilter filtroImagen=new FileNameExtensionFilter("JPG, PNG & GIF","jpg","png","gif");
    jfc.setFileFilter(filtroImagen);
    int opcion = jfc.showOpenDialog(getParent());
    String path="";

    //Si pulsamos en aceptar
    if (opcion==jfc.APPROVE_OPTION){

        path = jfc.getSelectedFile().getAbsolutePath();         


    }return path;
}

public void cargarImagen(String path){

    //txFoto.setText(path);
    ImageIcon ii = new ImageIcon(path);
    Icon icono = new ImageIcon(ii.getImage().getScaledInstance(lblImagen.getWidth(), lblImagen.getHeight(), Image.SCALE_DEFAULT));
    lblImagen.setIcon(icono);

}

А это код ошибки:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (0) and height (0) must be non-zero
at java.awt.image.ReplicateScaleFilter.<init>(Unknown Source)
at java.awt.Image.getScaledInstance(Unknown Source)
at com.pcastelbon.interfaces.ContactoMantenimiento.cargarImagen(ContactoMantenimiento.java:384)
at com.pcastelbon.interfaces.ContactoMantenimiento.cargarDatos(ContactoMantenimiento.java:350)

ОБНОВИТЬ:

ContactoMantenimiento cmantenimiento = new ContactoMantenimiento();
                       c.setFechaNacimiento(cmantenimiento.parseFecha(txFecha.getText()));          
                cmantenimiento.setTitle("Modificar [ "+c.getNombre()+" "+c.getApellido1()+" ]");
                cmantenimiento.setContacto(c);
                cmantenimiento.cargarDatos(c);
                cmantenimiento.setVisible(true);                    


                //Actualizar tabla
                cargarTabla();

Я думаю, что проблема в том, что я вызываю cargarDatos (), который загружает данные (включая изображение) до setvisible (true). Но я не могу поставить это после, потому что мой jdialog модальный. Любая идея??

1
Pedro 23 Дек 2015 в 22:40

3 ответа

Лучший ответ

Сообщение об ошибке сообщает вам, что именно не так:

Исключение в потоке «AWT-EventQueue-0» java.lang.IllegalArgumentException: ширина (0) и высота (0) должны быть ненулевыми.

Я предполагаю, что именно эта строка вызывает исключение:

new ImageIcon(ii.getImage().getScaledInstance(lblImagen.getWidth(), 
       lblImagen.getHeight(), Image.SCALE_DEFAULT));

Помните, что ваш JLabel имеет ширину и высоту 0 и, вероятно, не был обработан во время первого вызова метода cargarImagen(...). Я бы не стал основывать размер изображения на текущей ширине или высоте метки во время создания, а также не стал бы устанавливать размеры как можно больше. Если вам нужна дополнительная помощь, создайте и опубликуйте действующий минимальный пример программы, гораздо меньший фрагмент кода, представляющий собой законченную программу, которая содержит только код, необходимый для демонстрации вашей проблемы, который мы можем копировать, вставлять, компилировать и запускать без изменений.


Но я не могу поставить это после, потому что мой jdialog модальный. Любая идея??

Да, опять же, не основывайте размер значков на размере JLabel. Опять же, рассмотрите возможность размещения кода, который мы можем связать, который мы действительно можем запустить, минимального примера кода, демонстрирующего вашу проблему, SSCCE . Это позволит нам запустить ваш код, изменить его и, возможно, даже исправить. Пожалуйста, прочтите ссылку, прежде чем отвечать, поскольку она содержит много важных деталей о требованиях SSCCE. Вы разместили слишком много кода, большая часть которого совершенно не связана с рассматриваемой проблемой, и большая часть этого кода, включая неосновные макеты Java и изображения, которых у нас нет, не позволяют нам скомпилировать и запустить ваш код.

3
Hovercraft Full Of Eels 23 Дек 2015 в 20:27

Ваше изображение не может быть найдено системой, поэтому вы получаете пустой ImageIcon, а затем IllegalArgumentException при попытке изменить размер этого пустого изображения в cargarImagen.

Попробуйте это, чтобы проверить, существует ли запрошенное изображение:

public ImageIcon checkImagePath(String path) {
    URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}
0
Leet-Falcon 23 Янв 2016 в 15:05

Я наконец решил проблему, установив размер иконки самостоятельно. Проблема заключалась в том, что я получал размер jLabel до завершения конструктора.

Вот в чем проблема:

new ImageIcon(ii.getImage().getScaledInstance(lblImagen.getWidth(), 
   lblImagen.getHeight(), Image.SCALE_DEFAULT));

И вот как я это решил:

 new ImageIcon(ii.getImage().getScaledInstance(150,200, Image.SCALE_DEFAULT));

Я думаю, что есть лучший способ решить эту проблему, поэтому я буду продолжать попытки.

Большое спасибо.

0
Pedro 24 Дек 2015 в 10:54