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

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

pQYGZzk.png

当用户单击右侧的图片之一时,我希望它的一个小的预览显示在左上角的橙色区域中。我通过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来利用灵活的布局选项和选择处理,如下所示。

30dcdc79533a077af4dc74901138c45b.png

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim简单命令教程-firstblood

你想以最快的速度学习人类史上最好的文本编辑器VIM吗&#xff1f;你先得懂得如何在VIM幸存下来&#xff0c;然后一点一点地学习各种戏法。 Vim the Six Billion Dollar editor Better, Stronger, Faster. 学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文…

第三课、Qt的诞生和本质------------------狄泰软件学院

一、GUI用户界面元素 &#xff08;1&#xff09;、GUI应用程序是由固定的窗口元素所构成 &#xff08;2&#xff09;、操作系统提供了创建用户界面元素所需要的函数 &#xff08;3&#xff09;、各自功能不同的函数依次调用&#xff0c;从而创建出界面元素 &#xff08;4&#…

java mapstring_ object 遍历_ListMapString,Object使用Java代码遍历以获取String,Object的值...

List>的结果集怎么使用Java代码遍历以获取String&#xff0c;Object的值&#xff1f;package excel;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class List1{public static void main(String[] args){Map map…

Linux tar命令高级用法——备份数据

Linux tar命令高级用法——备份数据 2015-12-31 Linux学习Linux上有功能强大的tar命令&#xff0c;tar最初是为了制作磁带备份&#xff08;tape archive&#xff09;而设计的&#xff0c;它的作用是把文件和目录备份到磁带中&#xff0c;然后从磁带中提取或恢复文件。现在我们可…

iOS uiviewcontroller 添加另外一个controller的View

需要 添加 [self addChildViewController:vc]; [_mainScrollView addSubview:vc.view];转载于:https://www.cnblogs.com/foolish-guo/p/6385288.html

mysql 即学a又学b_MySQL学习第一天

一、 数据库:*学习重点:创建数据库/向表添加记录/查询记录数据库概念:文件系统(存储和管理)数据库软件介绍:Oracle/MySQL/SQL server…分类:关系型数据库:关系模型组织数据非关系型数据库:键值对关系存储二、 mysql数据的存储方式:一台数据库服务器中会创建很多个数据库(一个项…

Intellij IDEA 快捷键(Mac)

编辑 格式化代码 AltCommandL 大小写切换 ShiftCommandU 包围 AltCommandT 选中代码抽取方法 AltCommandM 调试/运行查看 类关系视图 CommandAltU 查看所有的 TODO Command6 查询方法调用处 AltF7 搜索其它 隐藏 Intellij IDEA CommandH 自动提醒 Alt/(这是我自己设置的)…

Spark RDD算子介绍

Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理、交互式查询&#xff08;Spark SQL&#xff09;、实时流处理&#xff08;Spark Streaming&#xff09;、机器学习&#xff08;Spark MLlib&#xff09;和图计算&#xff08;GraphX&#xff09;。 Spark是MapReduc…

java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!

作者 | 中华石杉责编 | 伍杏玲本文经授权转载石杉的架构笔记(ID&#xff1a;shishan100)这篇文章我们来看看&#xff0c;世界上最优秀的分布式文件系统HDFS&#xff0c;是如何对超大文件的上传做性能优化的&#xff1f;首先&#xff0c;我们还是通过一张图来看一下文件上传的大…

CentOS7下安装Redis — 单节点

2019独角兽企业重金招聘Python工程师标准>>> 1. 环境准备 安装编译所需要的包&#xff1a; yum install gcc tcl 2. 下载redis http://download.redis.io/releases/redis-3.2.7.tar.gz 3. 安装redis ## 创建redis的安装目录 mkdir /usr/local/redis## 解压redis tar…

笔记本中美化代码的方法

这里向大家推荐一个很好用的记笔记软件,微软的OneNote,这个笔记软件,支持分区和分区组的创建,而且入门简单,界面简洁,很适合从word过渡过来的人来记笔记! 不过如果直接记笔记,对于程序员来说,可能希望代码在笔记本上更好看一些,那么应该怎么办呢?下面提供了在OneNote中,让代码…

工具使用——印象(汇总)

作者&#xff1a;桂。 时间&#xff1a;2017-02-09 23:11:30 链接&#xff1a;http://www.cnblogs.com/xingshansi/articles/6384097.html 说明&#xff1a;转载请注明出处&#xff0c;谢谢。 前言 本文仅仅介绍印象笔记的使用&#xff0c;至于挖掘机哪家强&#xff0c;本文不…

java final修饰属性_Java final关键字用来修饰类、方法、属性

1.final修饰类&#xff1a;这个类不能被继承。如&#xff1a;String类、StringBuffer类、System类。2.final修饰方法&#xff1a;不能被重写。如&#xff1a;Object类的getClass()方法。3.final修饰属性&#xff1a;此属性就是一个常量&#xff0c;一旦初始化就不可再被赋值。习…

SQL SERVER 数据导出JSON

执行下面的存储过程&#xff1a; SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE[dbo].[SerializeJSON](ParameterSQL AS VARCHAR(MAX))ASBEGINDECLARE SQL NVARCHAR(MAX)DECLARE XMLString VARCHAR(MAX)DECLARE XML XMLDECLARE Paramlist NVARCHAR(1000)SET …

JSP+Javabean+Servlet实现用户注册

在entity包下新建javabean 也就是实体类User 注意id用 Integer 而不用 int&#xff0c; 因为 int 自动初始化为0 public class User { private Integer id; private String username; private String password; 后面是set和get方法... 在Servlet包下创建servlet 右击Servlet…

main的方法是Java_Java中的main()方法

在Java中&#xff0c;main()方法是Java應用程序的入口方法&#xff0c;也就是說&#xff0c;程序在運行的時候&#xff0c;第一個執行的方法就是main()方法&#xff0c;這個方法和其他的方法有很大的不同&#xff0c;比如方法的名字必須是main&#xff0c;方法必須是public sta…

深入理解Python的logging模块:从基础到高级

在Python编程中&#xff0c;日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架&#xff0c;用于发出日志消息&#xff0c;这些消息可以被发送到各种输出源&#xff0c;如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块…

http请求连接

1、在Info.plist中添加NSAppTransportSecurity类型Dictionary。2、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES转载于:https://www.cnblogs.com/liuting-1204/p/5919233.html

数据库不完全恢复 以及恢复到测试环境:

sample 1: 1.清空归档日志 RMAN> crosscheck archivelog all; RMAN> delete achivelog all; 2.清空数据文件。 select name from v$datafile; rm v$datafile 3.恢复数据 ##check file date: ##把db数据恢复到&#xff1a;2017-02-05 00:00:00 ls -lt /ngenprdblog/ ls…

centos7安装java6_CentOS7.6安装jdk1.8

2、登录Linux服务器&#xff0c;通过rz命令将jdk导入服务器如果没有rz命令 需要先安装lrzszyum install lrzsz -y3、将jdk压缩包解压到指定路径 -C 指定路径4、配置环境变量编辑/etc/profile文件 在末尾加上以下内容 wq保存退出source /etc/profile文件 使配置文件生效export J…