java GUI 图片显示和切换窗口

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

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



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

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


一、写这篇文章为了啥

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

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

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


二、使用步骤

1.创建View.java文件

首先我们创建一个view文件,根据最基本的mvc结构,个人更建议写三个源文件以更清晰的进行函数的调用和修改。同时,避免了单个源文件在寻找过程中的困难,减少每个文件的代码量以提高各位在写作业时的查找效率。

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.创建listener.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){}
    }
}


总结

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

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

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现不同画布切换的方有很多种,以下是其中一种实现方。 首先,你需要创建一个 JFrame 即游戏窗口,然后在 JFrame 中添加多个 JPanel 即不同的画布。 接下来,你需要实现一个方法,用于在不同的 JPanel 之间进行切换。具体实现过程如下: 1. 在 JFrame 中定义一个 JPanel 变量,用于保存当前显示的 JPanel。 2. 在 JFrame 中定义多个 JPanel 变量,分别表示不同的画布。 3. 在 JFrame 的构造函数中,初始化所有的 JPanel 并将其中一个 JPanel 显示在 JFrame 中。 4. 编写一个方法,用于实现不同 JPanel 之间的切换。该方法接受一个 JPanel 参数,用于指定需要切换到的 JPanel。 5. 在切换方法中,首先需要从 JFrame 中移除当前显示的 JPanel,然后将传入的 JPanel 添加到 JFrame 中,并将其设置为当前显示的 JPanel。 下面是一个示例代码,用于实现不同 JPanel 之间的切换: ```java import java.awt.CardLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class GameFrame extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JPanel currentPanel; private JPanel loginPanel; private JPanel registerPanel; public GameFrame() { initUI(); } private void initUI() { setTitle("Game"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(new Dimension(300, 200)); setLocationRelativeTo(null); // 创建登录和注册面板 loginPanel = new JPanel(); loginPanel.add(new JButton("Login")); registerPanel = new JPanel(); registerPanel.add(new JButton("Register")); // 将登录和注册面板添加到容器中 Container contentPane = getContentPane(); contentPane.setLayout(new CardLayout()); contentPane.add(loginPanel, "Login"); contentPane.add(registerPanel, "Register"); // 默认显示登录面板 currentPanel = loginPanel; // 添加按钮,用于切换面板 JButton loginButton = new JButton("Login"); loginButton.setActionCommand("Login"); loginButton.addActionListener(this); JButton registerButton = new JButton("Register"); registerButton.setActionCommand("Register"); registerButton.addActionListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.add(loginButton); buttonPanel.add(registerButton); contentPane.add(buttonPanel, "Buttons"); } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); // 根据按钮命令切换面板 if (command.equals("Login")) { switchPanel(loginPanel); } else if (command.equals("Register")) { switchPanel(registerPanel); } } private void switchPanel(JPanel panel) { // 从容器中移除当前面板 getContentPane().remove(currentPanel); // 将新面板添加到容器中 getContentPane().add(panel); // 更新当前面板 currentPanel = panel; // 重新绘制界面 getContentPane().validate(); getContentPane().repaint(); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { GameFrame frame = new GameFrame(); frame.setVisible(true); }); } } ``` 注意,上述代码使用了 CardLayout 布局管理器,它可以方便地管理多个 JPanel,并且可以通过 show() 方法切换不同的 JPanel。如果你需要实现更复杂的界面切换效果,可以考虑使用其他布局管理器或自定义布局管理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值