0
点赞
收藏
分享

微信扫一扫

java GUI 图片显示和切换窗口

mm_tang 2022-04-13 阅读 100

简单有效的java窗口显示图片及切换

周末闲的莫得啥事,sui遂发个文章,供各位蒙受GUI上机痛苦的朋友们看看



 因为个人习惯等问题,本人在编程中喜欢使用多源文件的形势去编程,也希望各位觉得有可以学习之处的可以尝试一下。

同时,请注意本文各个类之间的相互引用,代码量较大,但有相对详细的注释,希望您看的愉快。


一、写这篇文章为了啥

        清明放个假,写了三天界面,搞了半天也没搞懂是为啥写不出了,所以又过了一周干脆直接重新写,结果发现重新写3个小时就写完了,真的是意外呢23333。

        所以为了各位只想完成作业的大学生们,在这里我发个小小的代码行,仅供各位参考。

(请各位注意,该代码分为三段,请各位完整阅读后再进行参考)

 


二、使用步骤

1.创建View.java文件

package analyzeImage;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class view extends JFrame {
    JMenu menu;//菜单
    listener listener;//监听器
    JPanel panel;//上侧按钮容器
    JMenuBar menuBar;//菜单栏
    JMenuItem open, exit;//菜单内容
    JButton next, former, zoomIn, zoomOut;//按钮
    JFrame window;//窗口
    FileDialog dialogOpen;//选择窗口
    JTable table;//表格组件
    mould m ;//模型
    ImageIcon icon;//图片装载容器
    JLabel label;//图片装载
    JTextArea area;//文本区
    view(){
        dialogOpen = new FileDialog(window,"打开",FileDialog.LOAD);

        listener = new listener();
        listener.setView(this);

        m = new mould("D:\\JavaProject\\Upmenchine");

        window = new JFrame("影像分析");
        window.setLayout(new BorderLayout());

        init();//窗口主要的装载,请仔细阅读

        window.setSize(1000,1000);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    void init(){
        area = new JTextArea("请在每次操作后滑动滚动条以查看\n");
        label = new JLabel();
        icon = new ImageIcon();
        panel = new JPanel();
        menu = new JMenu("文件");
        menuBar = new JMenuBar();
        open = new JMenuItem("打开文件");
        exit = new JMenuItem("退出");
        next = new JButton("上一张");
        former  = new JButton("下一张");
        zoomIn = new JButton("放大");
        zoomOut  = new JButton("缩小");

        menu.add(open);//装载菜单
        menu.add(exit);
        menuBar.add(menu);
        window.setJMenuBar(menuBar);

        area.setRows(5);//装载文本区
        area.setColumns(5);

        next.addActionListener(listener);//注册监听
        former.addActionListener(listener);
        exit.addActionListener(listener);
        open.addActionListener(listener);
        zoomIn.addActionListener(listener);
        zoomOut.addActionListener(listener);

        panel.add(next);//装载按钮
        panel.add(former);
        panel.add(zoomIn);
        panel.add(zoomOut);

        table = spwareTree("D:\\JavaProject\\Upmenchine");//生成右侧的表格选项
        table.addMouseListener(listener);
        putIcon("ZS170203002023.JPG");

        window.add(new JScrollPane(table),BorderLayout.EAST);//布局啦,自己看
        window.add(panel,BorderLayout.NORTH);
        window.add(new Myscoll(label),BorderLayout.CENTER);
        window.add(new JScrollPane(area),BorderLayout.SOUTH);
    }

    JTable spwareTree(String dir){//该处使用了一个函数以便init函数中不需要编写过多的表格组件的内容,提高可读性
        mould mo = new mould(dir);
        table = new JTable(mo.a,mo.file);
        DefaultTableModel model = new DefaultTableModel(mo.a,mo.file);
        table = new JTable(model){
            public boolean isCellEditable(int row, int column){
                return false;
            }
        };
        table.setSelectionBackground(Color.YELLOW);
        return table;
    }

    void putIcon(String dir){//由于使用的是icon作为图片的装载容器,故涉及到多次更改的话还是声明一个函数吧
        Toolkit tool = Toolkit.getDefaultToolkit();
        Image image = tool.getImage(dir);
        icon.setImage(image);
        label.setIcon(icon);
    }

    void putIcon(Image image){//为保证有时候可以直接传导image文件,设置了此函数
        icon.setImage(image);
        label.setIcon(icon);
    }
}

class Myscoll extends JScrollPane{//此处重载了一下父类的构造方法,以便我的滚动窗口可以显示图片
    Myscoll(Component view){
        super(view);
    }
}

2.创建Mould.java源文件

代码如下:

package analyzeImage;


import java.io.File;
import java.io.FilenameFilter;
import java.util.Date;

class mould{
    Object file[] = {"文件名","大小","修改日期"};
    Object a[][];
    File[] fileList;
    file123123 abcd;

    mould(String dir){
        fileRead(dir);
    }//注意此处方法的调用

    void fileRead(String dir){//读取文件部分,请仔细阅读
        a = new Object[9][3];
        file123123 abcd = new file123123();
        abcd.setExtendName("JPG");
        File fir = new File("D:\\JavaProject\\Upmenchine");
        fileList = fir.listFiles(abcd);
        for (int i = 0;i<fileList.length;i++){
            a[i][0]=fileList[i].getName();
            a[i][2]=calculateTime(fileList[i].lastModified());
            a[i][1]=calculateSize(fileList[i].length());
        }
    }

    Date calculateTime(long time){
        return new Date(time);
    }//显示最后修改日期的代码

    String calculateSize(long size){//计算文件大小的部分,请注意使用的是double类型的数据,且参数是long
        double mb;
        mb = (double) (size/1024)/1000;
        return mb+"MB";
    }
}

class file123123 implements FilenameFilter {//该部分用于文件类型的筛选,并返回文件
    String extendName;

    public void setExtendName(String s){
        extendName = "."+s;
    }//请各位自行思考是为什么

    public boolean accept(File dir,String Name){
        return Name.endsWith(extendName);
    }
}

3.创建controler.java源文件 

package analyzeImage;

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

class listener implements ActionListener, MouseListener {
    analyzeImage.view view;
    mould m;
    BufferedImage bufferedImage;
    int doubleTimes = 1;
    int i = 4;

    listener(){
        m = new mould("D:\\JavaProject\\Upmenchine");
    }
    public void setView(view view){
        this.view = view;
    }//切记当窗口和监听不在一个类的时候要写入此行代码以实现监听

    public void mouseClicked(MouseEvent e){
        int i = view.table.getSelectedRow();
        String name = m.fileList[i].getName() ;
        view.putIcon(name);
        view.area.append("已切换\n");
        view.repaint();
    }

    //以下四行是因为实现了MouseListener接口而必须重写的方法,但实际代码中没有用到
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}

    public void actionPerformed(ActionEvent event){//该部分为事件响应部分,各位可以根据自己的需要增加或删减
        if (event.getSource() == view.next){
            doubleTimes =1;
            turnOver();
        }
        else if(event.getSource() == view.former){
            doubleTimes =1;
            turnBack();
        }
        else if(event.getSource() == view.open){
            open();
        }
        else if (event.getSource() == view.exit){
            System.exit(0);
        }
        else if(event.getSource() == view.zoomOut){
            zoomOut();
        }
        else if (event.getSource() == view.zoomIn){
            zoomin();
        }
    }

    private void open(){
        try{
            doubleTimes =1;
            view.dialogOpen.setVisible(true);
            view.putIcon(new File(view.dialogOpen.getDirectory()+view.dialogOpen.getFile()).getName());
            view.repaint();
            throw new IOException();
        }
        catch(IOException e){}
    }

    private void turnOver(){
        i--;
        try {
            doubleTimes =1;
            String name = m.fileList[i].getName();
            view.area.append("已读取图片" + name + "\n");
            view.putIcon(name);
            view.table.changeSelection(i,0,false,false);
            view.repaint();
        }
        catch(IndexOutOfBoundsException e){
            view.area.append("前面没有图片了\n");
            i++;
        }
    }

    private void turnBack(){
        i++;
        try {
            doubleTimes =1;
            String name = m.fileList[i].getName();
            view.area.append("已读取图片" + name + "\n");
            view.putIcon(name);
            view.table.changeSelection(i,0,false,false);
            view.repaint();
        }
        catch (IndexOutOfBoundsException e){
            view.area.append("后面没有图片了\n");
            i--;
        }
    }

    private void zoomin(){
        doubleTimes +=1;
        zoom(doubleTimes);
    }

    private void zoomOut(){
        doubleTimes -=1;
        zoom(doubleTimes);
    }

    private void zoom(int doubleTimes){
        int width;
        int height;
        File file = m.fileList[i];
        try {
            bufferedImage = ImageIO.read(file);
            width = bufferedImage.getWidth();
            height = bufferedImage.getHeight();
            width = width*doubleTimes;
            height = width*doubleTimes;
            if (width>0 & height>0) {
                Image iamge = bufferedImage.getScaledInstance(width, height, 1);
                view.putIcon(iamge);
                view.repaint();
                view.area.append("已缩放"+doubleTimes+"倍\n");
            }
            else{
                view.area.append("不能再缩放了\n");
            }
        }
        catch(IOException e){}
    }
}


总结

 各位请注意各段代码的注释,在注释部分有较为详细的解释和说明,如果还有问题欢迎与我交流。

        上机确实是一件非常苦恼的事情,但有时候不要一味的向前写,偶尔回个头看看或许会有意想不到的收获。

        写代码就是一个熟练的过程,各位不要忘记编程的目的是为了解决问题。正所谓实践出真知。加油吧各位!

举报

相关推荐

0 条评论