我正在用Swing编写Java GUI程序。该界面如下所示:

当用户单击右侧的图片之一时,我希望它的一个小的预览显示在左上角的橙色区域中。我通过SwingWorker线程从计算机上的目录中提取所有图像文件。在SwingWorker的done()方法中,我向每个对象添加了mouseClicked侦听器(我创建的类中的TaggableImage对象。它具有BufferedImage并扩展了JComponent,覆盖了paintComponent()方法)。在mouseClicked侦听器中,我调用橙色面板的add()方法并将其传递给TaggableImage。

我的问题:

当我单击其中一张图像时,它不会被添加到橙色面板中,并且会从右侧面板中消失。如果单击所有图像,则会在右侧面板空白。为什么会这样?

这是我的整个SwingWorker线程:

SwingWorker, Void> loadImagesAsyncWorker = new SwingWorker, Void>() {

ArrayList img_list = new ArrayList();

@Override

protected ArrayList doInBackground() throws Exception {

File currentDirectory = new File(".");

getFileInDirectory(currentDirectory);

return null;

}

// recursively get all files in this directory and child directories

private void getFileInDirectory(File cd) {

File[] file_list = cd.listFiles();

for (File f : file_list) {

if (f.isDirectory()) {

getFileInDirectory(f);

} else if (f.isFile()) {

BufferedImage bf = null;

String extension ="";

int i = f.getName().lastIndexOf('.');

int p = Math.max(f.getName().lastIndexOf('/'), f.getName()

.lastIndexOf('\'));

if (i > p) {

extension = f.getName().substring(i + 1);

}

System.out.println(f.getName());

if (extension.equals("jpg")) {

try {

bf = ImageIO.read(f);

TaggableImage ti = new TaggableImage(bf);

img_list.add(ti);

} catch (IOException e) {

}

}

}

}

}

public void done() {

for (TaggableImage ti : img_list) {

final TaggableImage final_ti = ti;

ti.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

final_ti.setMaximumSize(new Dimension(30, 30));

BorderLayout layout = (BorderLayout) getContentPane()

.getLayout();

if (layout.getLayoutComponent(BorderLayout.CENTER) != null) {

img_prev_panel.remove(layout

.getLayoutComponent(BorderLayout.CENTER));

}

//img_prev_panel = the orange panel

img_prev_panel.add(final_ti, BorderLayout.CENTER);

});

}

}

};

这是我的TaggableImage类:

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.awt.image.ColorModel;

import java.awt.image.WritableRaster;

import javax.swing.JComponent;

public class TaggableImage extends JComponent {

private static final long serialVersionUID = 1L;

private BufferedImage bufferedImage;

private int height;

private int width;

public TaggableImage(BufferedImage bufferedImage) {

this.bufferedImage = bufferedImage;

}

public TaggableImage(BufferedImage bufferedImage, int width, int height) {

this.bufferedImage = bufferedImage;

this.width = width;

this.height = height;

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(bufferedImage, 0, 0, null);

}

}

考虑发布MCVE。 请注意,一个组件只能有一个父级。 重新设定父级时,将从旧父级中删除该组件。 因此,当您将组件添加到img_prev_panel时,将从另一个容器中将其删除。

有没有一种方法可以将一个组件复制到另一个组件,同时为副本提供新的父对象?

您可以共享图像,在一个组件中显示缩略图版本,在另一个组件中显示完整尺寸。

我为此找到了Thumbnailator。

考虑在右侧面板上使用JList来利用灵活的布局选项和选择处理,如下所示。

import java.awt.Component;

import java.awt.Dimension;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridLayout;

import java.awt.RenderingHints;

import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;

import javax.swing.DefaultListCellRenderer;

import javax.swing.DefaultListModel;

import javax.swing.Icon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.ListSelectionModel;

import javax.swing.UIManager;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;

/**

* @see https://stackoverflow.com/a/25170471/230513

*/

public class ListDisplayPanel {

private static final Icon icon = UIManager.getIcon("html.pendingImage");

private ListPanel listPanel = new ListPanel();

private DisplayPanel displayPanel = new DisplayPanel();

private class DisplayPanel extends JPanel {

private static final int SIZE = 256;

private JLabel label = new JLabel();

public DisplayPanel() {

this.add(label);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2D temp = (Graphics2D) img.getGraphics();

icon.paintIcon(this, temp, 0, 0);

temp.dispose();

Graphics2D g2d = (Graphics2D) g;

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.drawImage(img, 0, 0, getWidth(), getHeight(), this);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(SIZE, SIZE);

}

}

private class ListPanel extends JPanel {

private static final int N = 5;

private DefaultListModel dlm = new DefaultListModel();

private JList list = new JList(dlm);

public ListPanel() {

super(new GridLayout());

for (int i = 0; i < N * N; i++) {

String name ="Cell-" + String.format("%02d", i);

dlm.addElement(name);

}

list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

list.setVisibleRowCount(N);

list.setCellRenderer(new ListRenderer());

list.addListSelectionListener(new SelectionHandler());

this.add(list);

}

private class ListRenderer extends DefaultListCellRenderer {

@Override

public Component getListCellRendererComponent(JList list,

Object value, int index, boolean isSelected, boolean cellHasFocus) {

JLabel label = (JLabel) super.getListCellRendererComponent(

list, value, index, isSelected, cellHasFocus);

label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));

label.setIcon(icon);

label.setHorizontalTextPosition(JLabel.CENTER);

label.setVerticalTextPosition(JLabel.BOTTOM);

return label;

}

}

private class SelectionHandler implements ListSelectionListener {

@Override

public void valueChanged(ListSelectionEvent e) {

if (!e.getValueIsAdjusting()) {

displayPanel.label.setText((String) dlm.getElementAt(e.getLastIndex()));

}

}

}

}

private void display() {

JFrame f = new JFrame("Test");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JSplitPane jsp = new JSplitPane();

jsp.setRightComponent(new JScrollPane(listPanel));

jsp.setLeftComponent(displayPanel);

f.add(jsp);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

}

public static void main(String[] args) {

EventQueue.invokeLater(() -> {

new ListDisplayPanel().display();

});

}

}

或者,让displayPanel包含SelectionHandler。

java clicked_关于java:JComponents在调用mouseClicked()之后消失相关推荐

  1. java 实现违章_基于JAVA的车辆违章查询数据调用代码实例

    基于JAVA的车辆违章查询数据调用代码实例 代码描述:基于JA V A的车辆违章查询数据调用代码实例 相关平台:聚合数据 import java.io.BufferedReader; import j ...

  2. java 执行cmd 堵塞_java中调用cmd命令被阻塞无法返回和继续执行

    在项目中用到了数据库的备份和恢复功能,就通过java的Runtime.getRuntime().exec()来调用cmd或者linux命令来导出和导入.sql文件.但是在执行恢复时,程序一直被阻塞,没 ...

  3. Java如何通过WSDL文件来调用这些web service

    下面我们来看Java如何通过WSDL文件来调用这些web service: 注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准, ...

  4. java实战调用数据库_实战php调用java类由java类读数据库完成相关操作(InberWrite)_PHP...

    1 建立系统ODBC 数据源photo(本次使用的是Oracle 9i,详细配置如有不懂这处再和我联系) 2 编译DataBaseConnection.java文件 将其编译文件放入到PHP支持的类文 ...

  5. libsvm java 实例_LibSVM Java API调用示例程序

    [实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...

  6. java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题

    Java 8的Java语言规范在"示例4.11-1.类型的用法"中提供了一个带有类型实参的方法调用示例: void loop(S s) { this.loop(s); // is ...

  7. 在Java中的foreach循环中调用remove

    本文翻译自:Calling remove in foreach loop in Java [duplicate] This question already has an answer here: 这 ...

  8. Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析

    本文主要向大家介绍了JAVA语言语言调用底层语言的技术JNI解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. java语言调用底层语言的技术JNI解析. Java代码执行步骤 JN ...

  9. java 字节码查看_一种查看java字节码时显示方法调用关系图的方法与流程

    本发明涉及一种代码逻辑分析方法,具体涉及一种查看java字节码时显示方法调用关系图的方法. 背景技术: 目前软件反编译领域有不少对可执行文件进行反编译的工具如IDA,也有对Java代码生成的中间码文件 ...

最新文章

  1. 看图说话:OpenGL模型矩阵和投影矩阵
  2. 简单有效!在CV/NLP/DL领域中,有哪些修改一行代码或者几行代码提升性能的算法?...
  3. ios 学习札记 细节(三)
  4. 阿里云docker hub
  5. php中如何定义常量和变量的区别,php define常量定义与变量区别
  6. fragment dispatchTouchEvent
  7. 蠢货别忘(一)common lisp funcall
  8. 内核链表list.h文件剖析
  9. 【BZOJ4602】齿轮,带权并查集
  10. 请举例说明python中**运算符的含义_举例讲解Python中的身份运算符的使用方法
  11. ios 的frame,bound,center
  12. 天天写代码,觉得自己特别苦逼?嗯,还有20年AI就来解放你
  13. sql语句大全+实例讲解
  14. 从0开始,html5零基础入门教程,快来看看!
  15. cofax(网络传真机) v3.1.0.0
  16. 软件测试的概括及流程
  17. Springboot 整合 druid
  18. 天财商龙餐饮系统服务器连接不上,天财商龙餐饮系统操作.docx
  19. CodeForces 950C Zebras
  20. RR正显著-不显著 -负显著

热门文章

  1. 解决:XXX类存在 却报错 Unkonwn class:‘XXX‘ 、@Autoeired 注入失败
  2. Git 安装及 idea 配置 Git
  3. rz、sz 命令 安装(Xshell 安装)
  4. 【融云分析】选择IM云服务,需要看哪些核心技术指标?
  5. STS的安装教程-鹏鹏
  6. 外籍主管眼中的阿里巴巴
  7. Android 第一篇
  8. 在一个数组中,如何确定所需元素在数组中的位置.
  9. 树形控件(CTreeCtrl和CTreeView)
  10. Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)