简单有效的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){}
}
}
总结
各位请注意各段代码的注释,在注释部分有较为详细的解释和说明,如果还有问题欢迎与我交流。
上机确实是一件非常苦恼的事情,但有时候不要一味的向前写,偶尔回个头看看或许会有意想不到的收获。
写代码就是一个熟练的过程,各位不要忘记编程的目的是为了解决问题。正所谓实践出真知。加油吧各位!