mirror of
https://github.com/tonikelope/megabasterd.git
synced 2025-04-30 14:44:33 +02:00
7.6
-Trying to put everything in place
This commit is contained in:
parent
8291a51ea5
commit
997a0491ea
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.tonikelope</groupId>
|
<groupId>com.tonikelope</groupId>
|
||||||
<artifactId>MegaBasterd</artifactId>
|
<artifactId>MegaBasterd</artifactId>
|
||||||
<version>7.5</version>
|
<version>7.6</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -921,7 +921,7 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
|
|||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getClose_button().setVisible(true);
|
getView().getClose_button().setVisible(true);
|
||||||
|
|
||||||
if (_status_error != null || _canceled) {
|
if ((_status_error != null || _canceled) && isProvision_ok()) {
|
||||||
|
|
||||||
getView().getRestart_button().setVisible(true);
|
getView().getRestart_button().setVisible(true);
|
||||||
|
|
||||||
@ -1001,8 +1001,6 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
|
|||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
|
|
||||||
LOG.log(SEVERE, null, ex);
|
|
||||||
|
|
||||||
_status_error = "Error registering download: file is already downloading.";
|
_status_error = "Error registering download: file is already downloading.";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1045,7 +1043,7 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
|
|||||||
getView().printStatusError(_status_error);
|
getView().printStatusError(_status_error);
|
||||||
|
|
||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getRestart_button().setVisible(true);
|
getView().getClose_button().setVisible(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1066,7 +1064,6 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
|
|||||||
getView().getFile_size_label().setText(formatBytes(_file_size));
|
getView().getFile_size_label().setText(formatBytes(_file_size));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
|
||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getClose_button().setVisible(true);
|
getView().getClose_button().setVisible(true);
|
||||||
getView().getQueue_up_button().setVisible(true);
|
getView().getQueue_up_button().setVisible(true);
|
||||||
@ -1077,6 +1074,8 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void pause_worker() {
|
public void pause_worker() {
|
||||||
|
|
||||||
synchronized (_workers_lock) {
|
synchronized (_workers_lock) {
|
||||||
|
@ -106,6 +106,8 @@ public class DownloadManager extends TransferenceManager {
|
|||||||
|
|
||||||
getTransference_waitstart_aux_queue().add(download);
|
getTransference_waitstart_aux_queue().add(download);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
getTransference_finished_queue().add(download);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ import java.sql.SQLException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Iterator;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -54,7 +54,7 @@ import javax.swing.UIManager;
|
|||||||
*/
|
*/
|
||||||
public final class MainPanel {
|
public final class MainPanel {
|
||||||
|
|
||||||
public static final String VERSION = "7.5";
|
public static final String VERSION = "7.6";
|
||||||
public static final int THROTTLE_SLICE_SIZE = 16 * 1024;
|
public static final int THROTTLE_SLICE_SIZE = 16 * 1024;
|
||||||
public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024;
|
public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024;
|
||||||
public static final int STREAMER_PORT = 1337;
|
public static final int STREAMER_PORT = 1337;
|
||||||
@ -1176,15 +1176,15 @@ public final class MainPanel {
|
|||||||
|
|
||||||
ArrayList<String> downloads_queue = DBTools.selectDownloadsQueue();
|
ArrayList<String> downloads_queue = DBTools.selectDownloadsQueue();
|
||||||
|
|
||||||
System.out.println(downloads_queue);
|
|
||||||
|
|
||||||
HashMap<String, HashMap<String, Object>> res = selectDownloads();
|
HashMap<String, HashMap<String, Object>> res = selectDownloads();
|
||||||
|
|
||||||
System.out.println(res);
|
|
||||||
|
|
||||||
tot_downloads = res.size();
|
tot_downloads = res.size();
|
||||||
|
|
||||||
for (String url : downloads_queue) {
|
Iterator downloads_queue_iterator = downloads_queue.iterator();
|
||||||
|
|
||||||
|
while (downloads_queue_iterator.hasNext()) {
|
||||||
|
|
||||||
|
String url = (String) downloads_queue_iterator.next();
|
||||||
|
|
||||||
HashMap<String, Object> o = res.remove(url);
|
HashMap<String, Object> o = res.remove(url);
|
||||||
|
|
||||||
@ -1201,32 +1201,19 @@ public final class MainPanel {
|
|||||||
getDownload_manager().getTransference_provision_queue().add(download);
|
getDownload_manager().getTransference_provision_queue().add(download);
|
||||||
|
|
||||||
conta_downloads++;
|
conta_downloads++;
|
||||||
}
|
|
||||||
|
|
||||||
|
downloads_queue_iterator.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBTools.truncateDownloadsQueue();
|
DBTools.truncateDownloadsQueue();
|
||||||
|
|
||||||
for (Map.Entry<String, HashMap<String, Object>> entry : res.entrySet()) {
|
if (!downloads_queue.isEmpty()) {
|
||||||
|
DBTools.insertDownloadsQueue(downloads_queue);
|
||||||
String email = (String) entry.getValue().get("email");
|
|
||||||
|
|
||||||
MegaAPI ma = new MegaAPI();
|
|
||||||
|
|
||||||
if (!tthis.isUse_mega_account_down() || (_mega_accounts.get(email) != null && (ma = checkMegaAccountLoginAndShowMasterPassDialog(tthis, getView(), email)) != null)) {
|
|
||||||
|
|
||||||
Download download = new Download(tthis, ma, (String) entry.getKey(), (String) entry.getValue().get("path"), (String) entry.getValue().get("filename"), (String) entry.getValue().get("filekey"), (Long) entry.getValue().get("filesize"), (String) entry.getValue().get("filepass"), (String) entry.getValue().get("filenoexpire"), _use_slots_down, false, (String) entry.getValue().get("custom_chunks_dir"), false);
|
|
||||||
|
|
||||||
getDownload_manager().getTransference_provision_queue().add(download);
|
|
||||||
|
|
||||||
conta_downloads++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
|
|
||||||
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||||
} catch (Exception ex2) {
|
} catch (Exception ex2) {
|
||||||
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex2);
|
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex2);
|
||||||
@ -1243,7 +1230,11 @@ public final class MainPanel {
|
|||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getjTabbedPane1().setSelectedIndex(0);
|
getView().getjTabbedPane1().setSelectedIndex(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
setResume_downloads(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getStatus_down_label().setText("");
|
getView().getStatus_down_label().setText("");
|
||||||
});
|
});
|
||||||
@ -1345,7 +1336,11 @@ public final class MainPanel {
|
|||||||
|
|
||||||
tot_uploads = res.size();
|
tot_uploads = res.size();
|
||||||
|
|
||||||
for (String filename : uploads_queue) {
|
Iterator uploads_queue_iterator = uploads_queue.iterator();
|
||||||
|
|
||||||
|
while (uploads_queue_iterator.hasNext()) {
|
||||||
|
|
||||||
|
String filename = (String) uploads_queue_iterator.next();
|
||||||
|
|
||||||
HashMap<String, Object> o = res.remove(filename);
|
HashMap<String, Object> o = res.remove(filename);
|
||||||
|
|
||||||
@ -1364,47 +1359,27 @@ public final class MainPanel {
|
|||||||
getUpload_manager().getTransference_provision_queue().add(upload);
|
getUpload_manager().getTransference_provision_queue().add(upload);
|
||||||
|
|
||||||
conta_uploads++;
|
conta_uploads++;
|
||||||
} else {
|
|
||||||
throw new Exception("Mega Login Error!");
|
uploads_queue_iterator.remove();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
deleteUpload((String) o.get("filename"), email);
|
deleteUpload((String) o.get("filename"), email);
|
||||||
|
|
||||||
tot_uploads--;
|
tot_uploads--;
|
||||||
|
|
||||||
|
uploads_queue_iterator.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBTools.truncateUploadsQueue();
|
DBTools.truncateUploadsQueue();
|
||||||
|
|
||||||
for (Map.Entry<String, HashMap<String, Object>> entry : res.entrySet()) {
|
if (!uploads_queue.isEmpty()) {
|
||||||
|
DBTools.insertUploadsQueue(uploads_queue);
|
||||||
String email = (String) entry.getValue().get("email");
|
|
||||||
|
|
||||||
if (_mega_accounts.get(email) != null) {
|
|
||||||
|
|
||||||
MegaAPI ma;
|
|
||||||
|
|
||||||
if ((ma = checkMegaAccountLoginAndShowMasterPassDialog(tthis, getView(), email)) != null) {
|
|
||||||
|
|
||||||
Upload upload = new Upload(tthis, ma, (String) entry.getKey(), (String) entry.getValue().get("parent_node"), (String) entry.getValue().get("ul_key") != null ? bin2i32a(BASE642Bin((String) entry.getValue().get("ul_key"))) : null, (String) entry.getValue().get("url"), (String) entry.getValue().get("root_node"), BASE642Bin((String) entry.getValue().get("share_key")), (String) entry.getValue().get("folder_link"), false);
|
|
||||||
|
|
||||||
getUpload_manager().getTransference_provision_queue().add(upload);
|
|
||||||
|
|
||||||
conta_uploads++;
|
|
||||||
} else {
|
|
||||||
throw new Exception("Mega Login Error!");
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
deleteUpload((String) entry.getValue().get("filename"), email);
|
|
||||||
tot_uploads--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
@ -1424,6 +1399,8 @@ public final class MainPanel {
|
|||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getView().getjTabbedPane1().setSelectedIndex(1);
|
getView().getjTabbedPane1().setSelectedIndex(1);
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
setResume_uploads(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
|
@ -316,8 +316,6 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
getMain_panel().getUpload_manager().secureNotify();
|
getMain_panel().getUpload_manager().secureNotify();
|
||||||
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1051,14 +1049,11 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!getMain_panel().getDownload_manager().getTransference_preprocess_global_queue().isEmpty()) {
|
|
||||||
|
|
||||||
download = new Download(getMain_panel(), ma, url, dl_path, null, null, null, null, null, getMain_panel().isUse_slots_down(), false, getMain_panel().isUse_custom_chunks_dir() ? getMain_panel().getCustom_chunks_dir() : null, dialog.getPriority_checkbox().isSelected());
|
download = new Download(getMain_panel(), ma, url, dl_path, null, null, null, null, null, getMain_panel().isUse_slots_down(), false, getMain_panel().isUse_custom_chunks_dir() ? getMain_panel().getCustom_chunks_dir() : null, dialog.getPriority_checkbox().isSelected());
|
||||||
|
|
||||||
getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
||||||
|
|
||||||
getMain_panel().getDownload_manager().secureNotify();
|
getMain_panel().getDownload_manager().secureNotify();
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
private int _max_running_trans;
|
private int _max_running_trans;
|
||||||
private final MainPanel _main_panel;
|
private final MainPanel _main_panel;
|
||||||
private final Object _secure_notify_lock;
|
private final Object _secure_notify_lock;
|
||||||
private final Object _wait_aux_queue_sort_lock;
|
|
||||||
private final Object _wait_queue_lock;
|
private final Object _wait_queue_lock;
|
||||||
private boolean _notified;
|
private boolean _notified;
|
||||||
private volatile boolean _removing_transferences;
|
private volatile boolean _removing_transferences;
|
||||||
@ -52,6 +51,7 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
protected final Object _total_size_lock;
|
protected final Object _total_size_lock;
|
||||||
protected volatile long _total_progress;
|
protected volatile long _total_progress;
|
||||||
protected final Object _total_progress_lock;
|
protected final Object _total_progress_lock;
|
||||||
|
protected final Object _transference_queue_sort_lock;
|
||||||
private volatile Boolean _sort_wait_start_queue;
|
private volatile Boolean _sort_wait_start_queue;
|
||||||
|
|
||||||
public TransferenceManager(MainPanel main_panel, int max_running_trans, javax.swing.JLabel status, javax.swing.JPanel scroll_panel, javax.swing.JButton close_all_button, javax.swing.JButton pause_all_button, javax.swing.MenuElement clean_all_menu) {
|
public TransferenceManager(MainPanel main_panel, int max_running_trans, javax.swing.JLabel status, javax.swing.JPanel scroll_panel, javax.swing.JButton close_all_button, javax.swing.JButton pause_all_button, javax.swing.MenuElement clean_all_menu) {
|
||||||
@ -75,7 +75,7 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
_secure_notify_lock = new Object();
|
_secure_notify_lock = new Object();
|
||||||
_total_size_lock = new Object();
|
_total_size_lock = new Object();
|
||||||
_total_progress_lock = new Object();
|
_total_progress_lock = new Object();
|
||||||
_wait_aux_queue_sort_lock = new Object();
|
_transference_queue_sort_lock = new Object();
|
||||||
_wait_queue_lock = new Object();
|
_wait_queue_lock = new Object();
|
||||||
_sort_wait_start_queue = true;
|
_sort_wait_start_queue = true;
|
||||||
_transference_preprocess_global_queue = new ConcurrentLinkedQueue<>();
|
_transference_preprocess_global_queue = new ConcurrentLinkedQueue<>();
|
||||||
@ -179,10 +179,6 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
_starting_transferences = starting;
|
_starting_transferences = starting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object geWaitStartAuxQueue_sort_lock() {
|
|
||||||
return _wait_aux_queue_sort_lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPreprocessing_transferences(boolean preprocessing) {
|
public void setPreprocessing_transferences(boolean preprocessing) {
|
||||||
_preprocessing_transferences = preprocessing;
|
_preprocessing_transferences = preprocessing;
|
||||||
}
|
}
|
||||||
@ -232,26 +228,39 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<Transference> getTransference_provision_queue() {
|
public ConcurrentLinkedQueue<Transference> getTransference_provision_queue() {
|
||||||
|
|
||||||
|
synchronized (_transference_queue_sort_lock) {
|
||||||
return _transference_provision_queue;
|
return _transference_provision_queue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<Transference> getTransference_waitstart_queue() {
|
public ConcurrentLinkedQueue<Transference> getTransference_waitstart_queue() {
|
||||||
synchronized (_wait_aux_queue_sort_lock) {
|
|
||||||
|
synchronized (_transference_queue_sort_lock) {
|
||||||
return _transference_waitstart_queue;
|
return _transference_waitstart_queue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<Transference> getTransference_remove_queue() {
|
public ConcurrentLinkedQueue<Transference> getTransference_remove_queue() {
|
||||||
|
|
||||||
|
synchronized (_transference_queue_sort_lock) {
|
||||||
return _transference_remove_queue;
|
return _transference_remove_queue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<Transference> getTransference_finished_queue() {
|
public ConcurrentLinkedQueue<Transference> getTransference_finished_queue() {
|
||||||
|
|
||||||
|
synchronized (_transference_queue_sort_lock) {
|
||||||
return _transference_finished_queue;
|
return _transference_finished_queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<Transference> getTransference_running_list() {
|
public ConcurrentLinkedQueue<Transference> getTransference_running_list() {
|
||||||
|
synchronized (_transference_queue_sort_lock) {
|
||||||
return _transference_running_list;
|
return _transference_running_list;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public JPanel getScroll_panel() {
|
public JPanel getScroll_panel() {
|
||||||
return _scroll_panel;
|
return _scroll_panel;
|
||||||
@ -485,23 +494,23 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
return _transference_waitstart_aux_queue;
|
return _transference_waitstart_aux_queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void sortTransferenceWaitStartAuxQueue() {
|
protected void sortTransferenceQueue(ConcurrentLinkedQueue<Transference> queue) {
|
||||||
|
|
||||||
synchronized (_wait_aux_queue_sort_lock) {
|
synchronized (_transference_queue_sort_lock) {
|
||||||
|
|
||||||
ArrayList<Transference> trans_list = new ArrayList(getTransference_waitstart_aux_queue());
|
ArrayList<Transference> trans_list = new ArrayList(queue);
|
||||||
|
|
||||||
trans_list.sort((Transference o1, Transference o2) -> o1.getFile_name().compareToIgnoreCase(o2.getFile_name()));
|
trans_list.sort((Transference o1, Transference o2) -> o1.getFile_name().compareToIgnoreCase(o2.getFile_name()));
|
||||||
|
|
||||||
getTransference_waitstart_aux_queue().clear();
|
queue.clear();
|
||||||
|
|
||||||
getTransference_waitstart_aux_queue().addAll(trans_list);
|
queue.addAll(trans_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void unfreezeTransferenceWaitStartQueue() {
|
protected void unfreezeTransferenceWaitStartQueue() {
|
||||||
|
|
||||||
synchronized (_wait_aux_queue_sort_lock) {
|
synchronized (getTransference_waitstart_aux_queue()) {
|
||||||
|
|
||||||
getTransference_waitstart_queue().forEach((t) -> {
|
getTransference_waitstart_queue().forEach((t) -> {
|
||||||
t.unfreeze();
|
t.unfreeze();
|
||||||
@ -672,13 +681,13 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (geWaitStartAuxQueue_sort_lock()) {
|
synchronized (_transference_queue_sort_lock) {
|
||||||
|
|
||||||
if (getSort_wait_start_queue()) {
|
if (getSort_wait_start_queue()) {
|
||||||
sortTransferenceWaitStartAuxQueue();
|
sortTransferenceQueue(getTransference_waitstart_aux_queue());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getTransference_waitstart_aux_queue().peek().isPriority()) {
|
if (getTransference_waitstart_aux_queue().peek() != null && getTransference_waitstart_aux_queue().peek().isPriority()) {
|
||||||
|
|
||||||
ArrayList<Transference> trans_list = new ArrayList(getTransference_waitstart_queue());
|
ArrayList<Transference> trans_list = new ArrayList(getTransference_waitstart_queue());
|
||||||
|
|
||||||
@ -700,6 +709,9 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea
|
|||||||
getScroll_panel().add((Component) t.getView());
|
getScroll_panel().add((Component) t.getView());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sortTransferenceQueue(getTransference_finished_queue());
|
||||||
|
|
||||||
getTransference_finished_queue().forEach((t) -> {
|
getTransference_finished_queue().forEach((t) -> {
|
||||||
swingInvoke(() -> {
|
swingInvoke(() -> {
|
||||||
getScroll_panel().remove((Component) t.getView());
|
getScroll_panel().remove((Component) t.getView());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user