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.pswp.cn/news/457223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457223.shtml
英文地址,請注明出處:http://en.pswp.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…