简体   繁体   English

如何使用 JavaSwing 显示用户在 JFrame 上选择的图像

[英]How to display an image that a user has selected on the JFrame using JavaSwing

I am trying to add a "profile picture" to a user's profile page.我正在尝试将“个人资料图片”添加到用户的个人资料页面。 Basically, I have it to where they can select a file from their computer and upload it to the application, and it will display their profile picture.基本上,我有它到他们可以从他们的计算机 select 一个文件并将其上传到应用程序的地方,它会显示他们的个人资料图片。 However it is not working, I think that it currently cannot display it, but generates it incorrectly.但是它不起作用,我认为它当前无法显示它,但生成它不正确。

Here is my code这是我的代码

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.ObjectInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFileChooser;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

class createProfilePage extends JFrame implements ActionListener {
    Container container = getContentPane();

    JLabel name = new JLabel("Name: ");
    JTextField nameField = new JTextField();

    JLabel age = new JLabel("Age: ");
    JTextField ageField = new JTextField();

    JLabel interest = new JLabel("Interests: ");
    JTextField interestField = new JTextField();

    JLabel aboutMe = new JLabel("About me: ");
    JTextField aboutMeField = new JTextField();

    JLabel phoneNum = new JLabel("Phone Number: ");
    JTextField phoneNumberField = new JTextField();

    JButton submit = new JButton("Save Profile");
    JButton deleteProfile = new JButton("Delete Profile");

    JButton uploadPic = new JButton("Upload Profile Picture");

    createProfilePage()
    {
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        //setting container
        setLayoutManager();
        setLocationAndSize();
        addComponents();
        addActionEvent();

        setTitle("Welcome");
        setSize(600, 500);
    }
    public void setLayoutManager() {
        container.setLayout(null);
    }
    public void setLocationAndSize()
    {
        //Setting location and Size of each components using setBounds() method.
        name.setBounds(50,100,100,30);
        age.setBounds(50,170,100,30);
        phoneNum.setBounds(50,240,100,30);
        interest.setBounds(50,310,100,30);
        aboutMe.setBounds(50,380,100,30);

        submit.setBounds(350, 240, 150, 30);
        deleteProfile.setBounds(350,310,150,30);
        uploadPic.setBounds(350,380,150,30);

        nameField.setBounds(150,100,150,30);
        ageField.setBounds(150,170,150,30);
        phoneNumberField.setBounds(150,240,150,30);
        interestField.setBounds(150,310,150,30);
        aboutMeField.setBounds(150,380,150,30);
    }
    public void addComponents() {
        container.add(name);
        container.add(age);
        container.add(phoneNum);
        container.add(interest);
        container.add(aboutMe);
        container.add(nameField);
        container.add(ageField);
        container.add(phoneNumberField);
        container.add(interestField);
        container.add(aboutMeField);
        container.add(submit);
        container.add(deleteProfile);
        container.add(uploadPic);
    }
    public void addActionEvent() {
        submit.addActionListener(this);
        deleteProfile.addActionListener(this);
        uploadPic.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == submit) {
            String name = nameField.getText();
            String age = ageField.getText();
            String phoneNum = phoneNumberField.getText();
            String interest = interestField.getText();
            String aboutMe = aboutMeField.getText();
            try {
                Socket socket = new Socket("localhost", 4242);
                ObjectInputStream reader = new ObjectInputStream(socket.getInputStream());
                //creating user object to send to the server
                User user = new User();
            } catch (IOException b) {
                b.printStackTrace();
            }



            JOptionPane.showMessageDialog(this, "Profile Creation Successful");
        } else if (e.getSource() == deleteProfile) {
            String name = null;
            String age = null;
            String phoneNum = null;
            String interest = null;
            String aboutMe = null;

            JOptionPane.showMessageDialog(this, "Profile Deletion Successful");
        } else if (e.getSource() == uploadPic) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
            int result = fileChooser.showOpenDialog(getParent());
            if (result == JFileChooser.APPROVE_OPTION) {
                try {
                    File file = fileChooser.getSelectedFile();
                    //ImageDrawer drawer = new ImageDrawer();
                    Toolkit toolkit = Toolkit.getDefaultToolkit();
                    String stringFile = file.toString();
                    Image image = toolkit.getImage(stringFile);
                    Path path = Paths.get(stringFile);
                    Path imagePath = path.toAbsolutePath();
                    String newStr = imagePath.toString();
                    BufferedImage picture = ImageIO.read(new File(newStr));

                    JLabel picLabel = new JLabel(new ImageIcon(picture));
                    picLabel.setBounds(350, 170, 150, 30);
                    add(picLabel);
                } catch (IOException g) {
                    JOptionPane.showMessageDialog(null,"ERROR");
                }
            }
        }
    }
}

在此处输入图像描述

Well it 'works' now.好吧,它现在“起作用”了。 This code can open and display an image the user selects.此代码可以打开并显示用户选择的图像。 The layout is still broken(1), as hinted by Upload Profile Pict... .正如Upload Profile Pict...所暗示的那样,布局仍然损坏(1)。 That guessed width and cut off text on this computer is one of the many reasons to use layout managers, padding & borders to position elements in a GUI.在这台计算机上猜测的宽度和截断文本是在 GUI 中使用 position 元素的布局管理器、填充和边框的众多原因之一。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

final class createProfilePage extends JFrame implements ActionListener {

    Container container = getContentPane();

    JLabel name = new JLabel("Name: ");
    JTextField nameField = new JTextField();
    JLabel age = new JLabel("Age: ");
    JTextField ageField = new JTextField();
    JLabel interest = new JLabel("Interests: ");
    JTextField interestField = new JTextField();
    JLabel aboutMe = new JLabel("About me: ");
    JTextField aboutMeField = new JTextField();
    JLabel phoneNum = new JLabel("Phone Number: ");
    JTextField phoneNumberField = new JTextField();
    JLabel picLabel = new JLabel();

    JButton submit = new JButton("Save Profile");
    JButton deleteProfile = new JButton("Delete Profile");
    JButton uploadPic = new JButton("Upload Profile Picture");

    createProfilePage() {
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        //setting container
        setLayoutManager();
        setLocationAndSize();
        addComponents();
        addActionEvent();

        setTitle("Welcome");
        setSize(600, 500);
    }

    public void setLayoutManager() {
        container.setLayout(null);
    }

    public void setLocationAndSize() {
        //Setting location and Size of each components using setBounds() method.
        name.setBounds(50, 100, 100, 30);
        age.setBounds(50, 170, 100, 30);
        phoneNum.setBounds(50, 240, 100, 30);
        interest.setBounds(50, 310, 100, 30);
        aboutMe.setBounds(50, 380, 100, 30);

        submit.setBounds(350, 240, 150, 30);
        deleteProfile.setBounds(350, 310, 150, 30);
        uploadPic.setBounds(350, 380, 150, 30);

        nameField.setBounds(150, 100, 150, 30);
        ageField.setBounds(150, 170, 150, 30);
        phoneNumberField.setBounds(150, 240, 150, 30);
        interestField.setBounds(150, 310, 150, 30);
        aboutMeField.setBounds(150, 380, 150, 30);
        picLabel.setBounds(350, 50, 150, 150);
    }

    public void addComponents() {
        container.add(name);
        container.add(age);
        container.add(phoneNum);
        container.add(interest);
        container.add(aboutMe);
        container.add(nameField);
        container.add(ageField);
        container.add(phoneNumberField);
        container.add(interestField);
        container.add(aboutMeField);
        container.add(picLabel);
        container.add(submit);
        container.add(deleteProfile);
        container.add(uploadPic);
    }

    public void addActionEvent() {
        submit.addActionListener(this);
        deleteProfile.addActionListener(this);
        uploadPic.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == uploadPic) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
            int result = fileChooser.showOpenDialog(getParent());
            if (result == JFileChooser.APPROVE_OPTION) {
                try {
                    File file = fileChooser.getSelectedFile();
                    BufferedImage picture = ImageIO.read(file);

                    picLabel.setIcon(new ImageIcon(picture));
                    add(picLabel);
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                    JOptionPane.showMessageDialog(null, "ERROR");
                }
            }
        }
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            new createProfilePage().setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}
  1. Personally, I'd take a different approach to the look of this.就个人而言,我会对这个外观采取不同的方法。 A toolbar at top for all the buttons.所有按钮的顶部工具栏。 the two columns of labels and fields on the left as seen there, but with the label text aligned right, and the fields different sizes as per need.如那里所示,左侧的两列标签和字段,但 label 文本向右对齐,并且字段根据需要不同大小。 Maybe even make the "About me:" a text area, rather than a field.甚至可以使“关于我:”成为一个文本区域,而不是一个字段。 Then, to the right of the label/field combos, the rest of the width and height devoted to the picture label.然后,在标签/字段组合的右侧,专用于图片 label 的宽度和高度的 rest。 It would be shown in a scroll pane (unless the pictures are all the same size).它将显示在滚动窗格中(除非图片大小相同)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM