java clicked_关于java:JComponents在调用mouseClicked()之后消失
我正在用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()之后消失相关推荐
- java 实现违章_基于JAVA的车辆违章查询数据调用代码实例
基于JAVA的车辆违章查询数据调用代码实例 代码描述:基于JA V A的车辆违章查询数据调用代码实例 相关平台:聚合数据 import java.io.BufferedReader; import j ...
- java 执行cmd 堵塞_java中调用cmd命令被阻塞无法返回和继续执行
在项目中用到了数据库的备份和恢复功能,就通过java的Runtime.getRuntime().exec()来调用cmd或者linux命令来导出和导入.sql文件.但是在执行恢复时,程序一直被阻塞,没 ...
- Java如何通过WSDL文件来调用这些web service
下面我们来看Java如何通过WSDL文件来调用这些web service: 注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准, ...
- java实战调用数据库_实战php调用java类由java类读数据库完成相关操作(InberWrite)_PHP...
1 建立系统ODBC 数据源photo(本次使用的是Oracle 9i,详细配置如有不懂这处再和我联系) 2 编译DataBaseConnection.java文件 将其编译文件放入到PHP支持的类文 ...
- libsvm java 实例_LibSVM Java API调用示例程序
[实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...
- java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题
Java 8的Java语言规范在"示例4.11-1.类型的用法"中提供了一个带有类型实参的方法调用示例: void loop(S s) { this.loop(s); // is ...
- 在Java中的foreach循环中调用remove
本文翻译自:Calling remove in foreach loop in Java [duplicate] This question already has an answer here: 这 ...
- Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析
本文主要向大家介绍了JAVA语言语言调用底层语言的技术JNI解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. java语言调用底层语言的技术JNI解析. Java代码执行步骤 JN ...
- java 字节码查看_一种查看java字节码时显示方法调用关系图的方法与流程
本发明涉及一种代码逻辑分析方法,具体涉及一种查看java字节码时显示方法调用关系图的方法. 背景技术: 目前软件反编译领域有不少对可执行文件进行反编译的工具如IDA,也有对Java代码生成的中间码文件 ...
最新文章
- 看图说话:OpenGL模型矩阵和投影矩阵
- 简单有效!在CV/NLP/DL领域中,有哪些修改一行代码或者几行代码提升性能的算法?...
- ios 学习札记 细节(三)
- 阿里云docker hub
- php中如何定义常量和变量的区别,php define常量定义与变量区别
- fragment dispatchTouchEvent
- 蠢货别忘(一)common lisp funcall
- 内核链表list.h文件剖析
- 【BZOJ4602】齿轮,带权并查集
- 请举例说明python中**运算符的含义_举例讲解Python中的身份运算符的使用方法
- ios 的frame,bound,center
- 天天写代码,觉得自己特别苦逼?嗯,还有20年AI就来解放你
- sql语句大全+实例讲解
- 从0开始,html5零基础入门教程,快来看看!
- cofax(网络传真机) v3.1.0.0
- 软件测试的概括及流程
- Springboot 整合 druid
- 天财商龙餐饮系统服务器连接不上,天财商龙餐饮系统操作.docx
- CodeForces 950C Zebras
- RR正显著-不显著 -负显著
热门文章
- 解决:XXX类存在 却报错 Unkonwn class:‘XXX‘ 、@Autoeired 注入失败
- Git 安装及 idea 配置 Git
- rz、sz 命令 安装(Xshell 安装)
- 【融云分析】选择IM云服务,需要看哪些核心技术指标?
- STS的安装教程-鹏鹏
- 外籍主管眼中的阿里巴巴
- Android 第一篇
- 在一个数组中,如何确定所需元素在数组中的位置.
- 树形控件(CTreeCtrl和CTreeView)
- Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)