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&#…

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;本文不…

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

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

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…

人生苦短,我用python——当我在玩python的时候我玩些什么 -

程序的基本思路 用一个txt文件记录电脑的一天内累计使用时间累计使用时间超过若干小时就会自动关机程序开机自动运行 为什么我最后选择了python 想着怎么写、搜资料的时候就发现Java并不适合&#xff0c;虽然不是不能实现&#xff0c;但有好几个问题解决起来都有点麻烦。对我这…

Twisted入门教程(5)

2019独角兽企业重金招聘Python工程师标准>>> 第五部分&#xff1a;由Twited支持的诗歌下载服务客户端 你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中&#xff0c;我们构建了第一个使用Twisted的客户端。它确实能很好地工作&#xff0c;但仍有提高…

**print('人生苦短 我爱Python')**

print(‘人生苦短 我爱Python’) 一、变量 **""" 1.代码自上而下执行 2_运算符和表达式.一行一句&#xff0c;不要把多个语句写到一行上&#xff0c;可读性不好 3中文只能出现在引号里&#xff0c;其他地方不能出现中文 4不能随意缩进 """**pr…

笔记本(华硕UL80VT)软件超频setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.试了setfsb各种版本&#xff0c;基本不能打开。还有官网的免费版&#xff0c;居然不能用&#xff0c;真是很奇怪。 官网&a…

Node.js~在linux上的部署

我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安装gcc环境 yum install gcc-c make 安装完成! 三 安装nodejs的npm,这是一个包程序工具…

LeetCode题解-3-Longest Substring Without Repeating Characters

2019独角兽企业重金招聘Python工程师标准>>> 解题思路 首先要读懂题目&#xff0c;它要求的是找到最长的子串&#xff0c;并且子串中没有出现重复的字符。 我的想法&#xff0c;是用一个map存储每个字符最后出现的位置&#xff0c;还要有个变量start&#xff0c;它用…

java从哪学到哪_Java JVM怎么学习啊?从哪方面入手?

叮当猫咪一、 JVM的生命周期  1. JVM实例对应了一个独立运行的java程序它是进程级别  a) 启动。启动一个Java程序时&#xff0c;一个JVM实例就产生了&#xff0c;任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点  b) 运行。m…

JMeter处理Cookie与Session

cookie 和session 的区别&#xff1a; 1、cookie数据存放在客户的浏览器上&#xff0c;session数据放在服务器上。 2、cookie不是很安全&#xff0c;别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当…

Maximum sum(poj 2479)

题意&#xff1a;给一段数列&#xff0c;将这个数列分成两部分&#xff0c;使两部分的最大子段和的和最大&#xff0c;输出和/*看数据没想到是(O)n的算法&#xff0c;求出从前向后的最大子段和和从后向前的最大子段和&#xff0c;然后枚举断点。 第一次提交不小心折在数组最小值…

蚂蚁分类信息系统 5.8 信息浏览量后台自定义设置

mymps 蚂蚁分类信息是一款基于PHPMySQL的建站系统,为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps5.8 下载 蚂蚁分类系统 5.8下载 蚂蚁分类系统下载 mymps下载 蚂蚁分类信息系统 5.8 原信息浏览量后台无法自定义&#xff0c;现增加后台自定义浏览量…

python编写四位数验证码

def verifycode(request):#引入绘图模块from PIL import Image, ImageDraw, ImageFont#引入随机函数模块import random#定义变量&#xff0c;用于画面的背景色、宽、高bgcolor (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width 100h…