用java编写一个图片浏览器

Python019

用java编写一个图片浏览器,第1张

import java.awt.BorderLayout

import java.awt.Graphics

import java.awt.GridLayout

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.io.File

import java.util.ArrayList

import javax.swing.ImageIcon

import javax.swing.JButton

import javax.swing.JFileChooser

import javax.swing.JFrame

import javax.swing.JMenu

import javax.swing.JMenuBar

import javax.swing.JMenuItem

import javax.swing.JPanel

public class ImageGallery extends JFrame implements ActionListener {

public static final int G_WIDTH = 400, G_HEIGHT = 620

public static final int L_WIDTH = 1200, L_HEIGHT = 520

public static final int MAX_R = 3, MAX_C = 2

public static final int GRID = 1, LARGE = 2

private JFileChooser chooser

private JMenuBar toolBar

private JMenu menu

private JMenuItem open

private ArrayList<String>paths

private JPanel showingPanel, buttonPanel

private int page = 1

private int count = 0

private int showType = GRID

private int pageMax

private JButton last, next, large, grid

public ImageGallery() {

this.setTitle("Image gallery 0.1")

this.setBounds(100, 100, G_WIDTH, G_HEIGHT)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

toolBar = new JMenuBar()

chooser = new JFileChooser()

chooser.setCurrentDirectory(new java.io.File("."))

chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)

menu = new JMenu("File")

toolBar.add(menu)

open = new JMenuItem("open")

open.addActionListener(this)

menu.add(open)

paths = new ArrayList<String>()

this.setJMenuBar(toolBar)

showingPanel = new JPanel()

buttonPanel = new JPanel()

last = new JButton("last")

last.addActionListener(this)

next = new JButton("next")

next.addActionListener(this)

large = new JButton("large")

large.addActionListener(this)

grid = new JButton("grid")

grid.addActionListener(this)

buttonPanel.add(last)

buttonPanel.add(large)

buttonPanel.add(grid)

buttonPanel.add(next)

this.add(buttonPanel, BorderLayout.SOUTH)

this.add(showingPanel)

this.setVisible(true)

}

public void doOpen() {

int result = chooser.showOpenDialog(null)

if (result == JFileChooser.APPROVE_OPTION) {

String directory = chooser.getSelectedFile().getPath()

this.getAllImage(directory)

for (String s : this.paths) {

System.out.println(s)

}

this.showingImage()

}

}

public void getAllImage(String directory) {

paths.clear()

page = 1

count = 0

File file = new File(directory)

if (file.isDirectory()) {

String[] list = file.list()

for (String s : list) {

String path = directory + "\\" + s

File temp = new File(path)

if (!temp.isDirectory()) {

this.paths.add(path)

}

}

}

}

public void changePage(int page) {

if (!paths.isEmpty()) {

switch (showType) {

case GRID:

this.page += page

if (this.page == 0) {

this.page = 1

}

if (this.page >pageMax) {

this.page = pageMax

}

break

case LARGE:

this.count += page

if (count <0) {

count = 0

}

if (count >paths.size() - 1) {

count = paths.size() - 1

}

break

}

this.showingImage()

}

}

public void showingImage() {

this.remove(showingPanel)

showingPanel = new JPanel()

int size = paths.size()

int max = MAX_R * MAX_C

pageMax = (size % max == 0 ? size / max : size / max + 1)

switch (showType) {

case GRID:

this.setBounds(100, 100, G_WIDTH, G_HEIGHT)

showingPanel.setLayout(new GridLayout(MAX_R, MAX_C - 1))

int i = (page - 1) * max

int j = page * max

for (i <j &&i <sizei++) {

String path = paths.get(i)

showingPanel.add(new ImagePanel(path))

}

break

case LARGE:

int left = count - 1

int right = count + 1

this.setBounds(100, 100, L_WIDTH, L_HEIGHT)

showingPanel.setLayout(new GridLayout(1, 2))

if (left >= 0) {

showingPanel.add(new ImagePanel(paths.get(left)))

} else {

showingPanel.add(new ImagePanel(""))

}

showingPanel.add(new ImagePanel(paths.get(count)))

if (right <size) {

showingPanel.add(new ImagePanel(paths.get(right)))

} else {

showingPanel.add(new ImagePanel(""))

}

break

}

this.add(showingPanel, BorderLayout.CENTER)

showingPanel.updateUI()

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

new ImageGallery()

}

class ImagePanel extends JPanel {

private ImageIcon image

ImagePanel(String path) {

image = new ImageIcon(path)

}

public ImageIcon getImageIcon() {

return this.image

}

@Override

protected void paintComponent(Graphics g) {

// TODO Auto-generated method stub

g.drawImage(image.getImage(), 0, 0, this.getWidth(), this

.getHeight(), this)

}

}

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

String key = e.getActionCommand()

System.out.println(key)

if (key.equals("open")) {

doOpen()

} else if (key.endsWith("last")) {

changePage(-1)

} else if (key.endsWith("next")) {

changePage(1)

} else if (key.endsWith("large")) {

if (!paths.isEmpty()) {

count =0

showType = LARGE

showingImage()

}

} else if (key.endsWith("grid")) {

if (!paths.isEmpty()) {

page = 1

showType = GRID

showingImage()

}

}

}

}

以前在itjob做过:就功能来讲:需要展示,需要上一页下一页,,,这是最简单的

布局上讲:一个Panel展示,一个Panel操作

设计的话,,首先得有图片的路径,可以保存在一个list链表中,点击上一页或下一页,展示图片的JPanel通过list的路径,找到相应的图片,并画出来,,这样就可以了

其他:至于其他的扩展功能,如全屏,旋转等,,都可以一点一点再加,先完成大体的架构功能吧

有两种方法:

1. 将图片缩放,也就是显示缩略图

2. 使用JScrollPane,显示滚动条

第一种比较复杂,这里给出第二种方法的实现:

将你代码的第17、18行改成:

label = new JLabel()

JScrollPane scroll = new JScrollPane(label)

add(scroll)