How a JTable sort will be not not on the thread of the event?

So I sort of comparator cheap that can use IO or striking of the data on the net to help him sort through.

My problem is this kind of JTables on the event thread and therefore freeze the GUI.

How do I change so it isn't? All RowSorters which is asynchronous?

Published by: Zammbi on February 7, 2011 17:46

It seems that this was listed as a bug: http://webcache.googleusercontent.com/search?q=cache:uDxYVZsX86sJ:bugs.sun.com/view_bug.do%3Fbug_id%3D6525923+jtable+sort+edt&cd=4&hl=en&ct=clnk&source= www.google.com

I kinda disagree.
The bug report is a huge JTable (35000 to 200000 lines). JTable is not suitable for this purpose - and I don't mean bugs or performance, but the user experience. It's pretty annoying to have to scroll through hundreds of pages, such use would deserve based on a query of filtering and paging, rather than scrolling.

Your case is slightly different: you have a (probably) valid condition for using JTable on a reasonable number of lines, it's just the line to get which is slow.

Maybe you can initialize your comparator or your rowsorter (extraction of additional data on the current model) off the coast of the EDT, and then set the comparator/rowsorter in the > EDT and leave the comparison work in the EDT as usual, using cached data.

I have semi already. It's a file browser. A file can be upgraded day/deleted/changed at any time. I'm also using the loading deferred. I can't guarantee that it won't freeze the fate for a few seconds.

So, if I understand correctly, it's not the kind that is slow, but the extraction (update of the list of files to get an up-to-date list) of lines?
Maybe you should periodically update the instance TableModel (built/load in a background thread and switched to the EDT) and let your sorter to run on the cache?

Anyway, if even the sort is slow, I suspect that all hope is not lost. Although this process could be made easier (in this regard, that the bug report could follow that instead), it seems possible to unload the sort to another thread without having to rewrite the event processing; I confess that I've never written, but I'd go with:
-wrap subclass TableRowSorter, two TableRowSorter real instances to the breast it: one instance would hold the current sorted order and the other of the following sort order.
-substitute the sort() method to trigger the real sorting of the nextSort to a background or a swing worker thread and return immediately.
-When the background thread is finished, post a request for the EDT to switch the sorters and call table.repaint () for the display of the new sorting view.

Tags: Java

Similar Questions

  • How can I delete a sticky note? The delete icon (red ball) is not in the top corner; There is an arrow to develop instead. I use El Capitan 10.11.3?

    How can I delete a sticky note? The delete icon (red ball) is not in the top corner; There is an arrow to develop instead. I use El Capitan 10.11.3?

    Just command-W to close and command + N to create a new.

  • before I unpack my 7520 one.how while many pages will be it scan at the same time

    before I unpack my 7520 one.how while many pages will be it scan at the same time

    Maybe a maximum of 50 sheets of paper are loaded in the ADF feeder at the same time.

  • How to block emails that are not in the list of contacts

    I have several e-mail everyday on sexualy explicit materia.  I put in my email account to block those who are not in the list of contacts, so they'll JUNK, but I need to check my JUNK e-mail folder frequently if there is something in there for someone that I have to answer.

    With some of the emails that I can "unsubscribe", but there must be a way to disable these ugly e-mail.

    Any suggestions?

    Margin

    I have several e-mail everyday on sexualy explicit materia.  I put in my email account to block those who are not in the list of contacts, so they'll JUNK, but I need to check my JUNK e-mail folder frequently if there is something in there for someone that I have to answer.

    With some of the emails that I can "unsubscribe", but there must be a way to disable these ugly e-mail.

    Any suggestions?

    Stopping the churn.  If they are unscrupulous - that simply confirms your e-mail address is * well * and it will be resold to new lists.

    Specifically, add them to your list of mail JUNK when you can, if you doubt, you will always receive an email, just to be sure, their entire domain.

    The only other suggestion is to get an other email address for your personal & business needs and start using it.  Make sure that you register for what whatever randomly with this specific e-mail address (control which give you out.)  A * lot * of junk mail occurs usually because someone came to something random at some point and then the address obtained on a 'list' that was happening around / sold.

  • How to import Windows some but not all the photos on my iPad Photo Gallery

    I have 50 photos on my ipad that are not duplicated on the Windows Photo Gallery. I want to transfer these 50 only.

    Plugin your Apple iPad!

    First go to control panel, AutoPlay, find your iPad under devices, open the menu drop down and

    choose: open the device to view files using Windows Explorer. Click Save.

    Unplug your iPad then replugin.

    When you plugin your iPad and Windows Explorer opens then AutoPlay work.

    If Windows Explorer does not AutoPlay does not work because you have Update KB971029

    To open your device manually: click Start, point to computer, click on Apple iPad.

    Double-click internal storage,

    Double click on the DCIM file, double-click the file, there are photos!

    Right-click on your desktop, point to new, and then click folder.

    Drag the image you want and hold it on the new folder, it will say then exit "copy to the new folder.

    the peak and it will be placed in the new folder.

    You can highlight as many photos as you want then click on one of the photos highlight and drag all the

    of them and place them in the folder at a time.

    Once inside the folder open Windows Photo Gallery.

    In the menu click file, click Add folder to Gallery, click new folder, OK

    This way you will be left with a double folder on the desktop that you can delete if you want.

    If you don't want a double record:

    You can open your photos in the start menu and drag the folder to your desktop computer for your

    pictures in the folder and the folder will be automatically added to the Windows Photo Gallery.

  • How right message pane of is not on the bottom?

    I like to see the message on the right side of TBird... not on the bottom. Is it possible to move the e-mail message pane?

    In the menu, see. Page layout

    Looks like you want to view "vertical."

    No menu? Under Linux or Windows, press the < alt > key to see the menu.

  • How to find computers that are not on the domain in an Active Directory forest.

    Hello

    I'm looking for a tool that can scan a subnet and give me the list of computers that are not on the field, but connected to the network. My company has recently spent a lot of users of the task force to the area, but there is a population of users who are unwilling to join the domain and still using the local administrator to log on to the computer.

    These computers do not meet the domain policies applied and causing many problems with the network and other systems on the field.

    Help, please.

    concerning

    Syed M. Uzair

    This issue is beyond the scope of this site and must be placed on Technet or MSDN

    http://social.msdn.Microsoft.com/forums/en-us/home

  • How can I check if a function is or is not called the event listener? in Flash CS4 (AS3)

    Hello

    I ran into a small problem.

    I put an event listener inside a loop for and the loop inside a function.

    I want the loop for to end as soon as the listener of events inside the for loop calls the function.

    Here is the general code for a better image.

    Code:

    this.addEventListener(Event.ENTER_FRAME, function#1);
    function function#1(event:Event):void{
              if(something is true){
                        for(var i = 0; i < numOfmy_mcs; i++){
                                  this["my_mc_"+String(i)].addEventListener(MouseEvent.CLICK, function#2);
                        }
              }
    }
    function function#2(e:Event):void{
    //do something cool here
    } 
    

    Thanks for any help!

    You can determine what the event object dispatched using e.target and e.currentTarget.  and it is not supposed to return anything to a listener.

    everything you try to do?  Click on one of a large number of objects and make and/or determine what?

  • How to conditionally sort a bar graph without displaying the order in OBIEE 11 g?

    Hello all;

    Draw a graph with revnue on the X axis and name of the product on the axis Y. I am trying to sort the name of the product based on the conditional sort order (requirement) and I've had to date. I don't want to be displayed, although the sort order. Get rid of the data labels is to get rid of the sort order and the number of revenue at the same time I can't afford. Could you please suggest a solution.

    Capture.PNG

    Thanks for your help.

    Hello

    Move your 'Sort order' column in the 'Group By' next to 'Product', make sure it is above 'Product' (to the order of products).

    Finally do just your hidden column and you will not see on the list, but it will always adjust the sort order of your products.

     

  • my calendar does not show the events back - but they are on my Macbook Pro

    My iPhone calendar does not display the back events before the current month - they are deleted or hidden? - but they still exist on my MacBook Pro.  How can I restore the history in the iPhone calendar?

    Try the settings > Mail, contacts, calendars > calendars > synchronization > all events - on the phone.

  • Class is not intercept the event

    It works fine the other way around. I can send an event to a class (extends sprite) and my main .fla catch. The other way around it doesn't work. Transmitting a number from my fla. for the class (added as a child) I send an event, but the class he never receives. What's wrong. Initially I wanted to expeditions the event in another class, but as far as I understand it, the event would be never passed from the other class events communicate to their parents.

    Hope my sketch helps a little. In fact the image (uiloader) must send the progress of loading directly, so the loading status bar could change its width. But as I could not get this to work, I started to dispatch another event in the main document that has placed the image and the loading dynamically on the stage bar. How do I need to add the listener to the LoadingStatus.as, so that it can change the width by itself?

    Charging status is placed like this

    -loading loading status-

    var loadingStatusLevel = imageArray2x.length + 1;
    imageArray2x [loadingStatusLevel] = new LoadingStatus(imageWidthAdapted[clickImageName],imageHeightAdapted[clickImageName]);
    imageArray2x [loadingStatusLevel] .x = 0;
    imageArray2x [loadingStatusLevel] = 0 there;
    imageArray2x [loadingStatusLevel] .buttonMode = false;
    imageArray2x [loadingStatusLevel] .visible = true;
    images.addChild (imageArray2x [loadingStatusLevel]);
    imageArray2x [loadingStatusLevel] .name = "loadingStatus";
    -image scale-
    } else {}
    scaleZoomInImage();
    }
    }


    Must respond to this

    function zoomInImageLoadingProgress(event:PercentageLoadedEvent):void {}
    trace ("Document:", event.percentLoadedOfImage);
    dispatchEvent (new LoadingStatusEvent (LoadingStatusEvent.LOADINGSTATUS_TYPE, event.percentLoadedOfImage));
    }

    LoadingStatus.as

    package {}
    import flash.display.Sprite;
    Import fl.containers.UILoader;
    Caurina.transitions import. *;
    import flash.events. *;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.AntiAliasType;

    SerializableAttribute public class LoadingStatus extends Sprite {}
    [Embed (systemFont = "standard 07_53", fontWeight = "normal", fontName = "StandardTextFont", mimeType = "application/x-font")]
    public static var StandardText: Class;

    private var amountLoadedText:TextField;
    private var textFormatAmountLoaded:TextFormat;
    private var imageWidth:int;
    private var imageHeight:int;
    private var loadingStatusX:int;
    private var loadingStatusY:int;
    private var loadingStatusWidth:int;
    private var loadingStatusHeight:int;
    private var amountLoaded:int;


    //
    //--------   --------
    public void LoadingStatus(iW:uint,iH:uint):void {}

    this.addEventListener (LoadingStatusEvent.LOADINGSTATUS_TYPE, showProgress);  Does not work as far as I can tell


    -text format active body-
    textFormatAmountLoaded = new TextFormat;
    textFormatAmountLoaded.font = "StandardTextFont";
    textFormatAmountLoaded.bold = false;
    textFormatAmountLoaded.color = 0xFFFFFF;
    textFormatAmountLoaded.size = 8;
    textFormatAmountLoaded.align = "right";
    //---
    imageWidth = iW;
    imageHeight = iH;
    loadingStatusWidth = imageWidth-200;
    loadingStatusHeight = 15;
    loadingStatusX = 100;
    loadingStatusY=Math.round(imageHeight/2-7.5);
    placeLoadingStatusBar();

    function placeLoadingStatusBar (): void {}
    -place loading status-
    var loadingStatusOrigin:Sprite = new Sprite;
    loadingStatusOrigin.x = loadingStatusX;
    loadingStatusOrigin.y = loadingStatusY;
    loadingStatusOrigin.buttonMode = false;
    loadingStatusOrigin.alpha =. 5;
    loadingStatusOrigin.name = "loadingStatusOrigin";
    addChild (loadingStatusOrigin);

    -place loading framework status-
    var loadingStatusFrame:Sprite = new Sprite;
    loadingStatusFrame.graphics.lineStyle (1, 0 x 000000, 1);
    loadingStatusFrame.graphics.beginFill(0xFFFFFF,1);
    loadingStatusFrame.graphics.drawRect (0,0,loadingStatusWidth,loadingStatusHeight);
    loadingStatusFrame.graphics.endFill ();
    loadingStatusFrame.width = loadingStatusWidth;
    loadingStatusFrame.height = loadingStatusHeight;
    loadingStatusFrame.buttonMode = false;
    loadingStatusFrame.name = "loadingStatusFrame";
    loadingStatusOrigin.addChild (loadingStatusFrame);

    -place loading bar State-
    var loadingStatusBar:Sprite = new Sprite;
    loadingStatusBar.graphics.beginFill (0 x 000000, 1);
    loadingStatusBar.graphics.drawRect (0,0,751,751);
    loadingStatusBar.graphics.endFill ();
    loadingStatusBar.x = 2;
    loadingStatusBar.y = 2;
    loadingStatusBar.width =(loadingStatusWidth-4);
    loadingStatusBar.height = loadingStatusHeight-4;
    loadingStatusBar.name = "loadingStatusBar";
    loadingStatusOrigin.addChild (loadingStatusBar);

    -Place the text field-
    amountLoadedText = new TextField;
    amountLoadedText.defaultTextFormat = textFormatAmountLoaded;
    amountLoadedText.embedFonts = true;
    amountLoadedText.antiAliasType = AntiAliasType.NORMAL;
    amountLoadedText.selectable = true;
    amountLoadedText.text="100% LOADED.
    amountLoadedText.width = 100;
    amountLoadedText.height = 15;
    amountLoadedText.x = loadingStatusWidth-101;
    amountLoadedText.y = 2;
    loadingStatusOrigin.addChild (amountLoadedText);
    amountLoadedText.name = "amountLoadedText";

    }

    function showProgress(event:LoadingStatusEvent):void {}
    trace ("loading :") status / /, event.percentLoadedOfImage ");
    getChildByName("loadingStatusBar").width =(loadingStatusWidth-4) * event.percentLoadedOfIm age;
    Tweener.addTween (getChildByName ("loadingStatusBar"), {width:(loadingStatusWidth-4) * event.percentLoadedOfImage, time: 5, transition: "easeInSmooth"});
    amountLoadedText.text = Math.round (event.percentLoadedOfImage) + "% LOADED";
    }

    }
    }
    }

    It would be great if someone has an idea how to solve this problem!

    See you soon!

    :

    Charging status is placed like this

    -loading loading status-

    var loadingStatusLevel = imageArray2x.length + 1;
    imageArray2x [loadingStatusLevel] = new LoadingStatus (imageWidthAdapted [clickImageName], imageHeightAdapted [clickImageNa me]);
    imageArray2x [loadingStatusLevel] .x = 0;
    imageArray2x [loadingStatusLevel] = 0 there;
    imageArray2x [loadingStatusLevel] .buttonMode = false;


    imageArray2x [loadingStatusLevel] .visible = true;
    images.addChild (imageArray2x [loadingStatusLevel]);
    imageArray2x [loadingStatusLevel] .name = "loadingStatus";
    -image scale-
    } else {}
    scaleZoomInImage();
    }
    }

    Must respond to this

    function zoomInImageLoadingProgress(event:PercentageLoadedEvent):void {}
    trace ("Document:", event.percentLoadedOfImage);

    imageArray2x [loadingStatusLevel] .dispatchEvent (LoadingStatusEvent (LoadingStatusEvent.LOADINGSTATUS_TYPE)) of new;

    }

    LoadingStatus.as

    package {}
    import flash.display.Sprite;
    Import fl.containers.UILoader;
    Caurina.transitions import. *;
    import flash.events. *;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.AntiAliasType;

    SerializableAttribute public class LoadingStatus extends Sprite {}
    [Embed (systemFont = "standard 07_53", fontWeight = "normal", fontName = "StandardTextFont", mimeType = "application/x-font")]
    public static var StandardText: Class;

    private var amountLoadedText:TextField;
    private var textFormatAmountLoaded:TextFormat;
    private var imageWidth:int;
    private var imageHeight:int;
    private var loadingStatusX:int;
    private var loadingStatusY:int;
    private var loadingStatusWidth:int;
    private var loadingStatusHeight:int;
    private var amountLoaded:int;

    //
    //--------   --------
    public void LoadingStatus(iW:uint,iH:uint):void {}

    this.addEventListener (LoadingStatusEvent.LOADINGSTATUS_TYPE, showProgress);  Does not work as far as I can tell

    -text format active body-
    textFormatAmountLoaded = new TextFormat;
    textFormatAmountLoaded.font = "StandardTextFont";
    textFormatAmountLoaded.bold = false;
    textFormatAmountLoaded.color = 0xFFFFFF;
    textFormatAmountLoaded.size = 8;
    textFormatAmountLoaded.align = "right";
    //---
    imageWidth = iW;
    imageHeight = iH;
    loadingStatusWidth = imageWidth-200;
    loadingStatusHeight = 15;
    loadingStatusX = 100;
    loadingStatusY=Math.round(imageHeight/2-7.5);
    placeLoadingStatusBar();

    function placeLoadingStatusBar (): void {}
    -place loading status-
    var loadingStatusOrigin:Sprite = new Sprite;
    loadingStatusOrigin.x = loadingStatusX;
    loadingStatusOrigin.y = loadingStatusY;
    loadingStatusOrigin.buttonMode = false;
    loadingStatusOrigin.alpha =. 5;
    loadingStatusOrigin.name = "loadingStatusOrigin";
    addChild (loadingStatusOrigin);

    -place loading framework status-
    var loadingStatusFrame:Sprite = new Sprite;
    loadingStatusFrame.graphics.lineStyle (1, 0 x 000000, 1);
    loadingStatusFrame.graphics.beginFill(0xFFFFFF,1);
    loadingStatusFrame.graphics.drawRect (0,0, loadingStatusWidth, loadingStatusHeight);
    loadingStatusFrame.graphics.endFill ();
    loadingStatusFrame.width = loadingStatusWidth;
    loadingStatusFrame.height = loadingStatusHeight;
    loadingStatusFrame.buttonMode = false;
    loadingStatusFrame.name = "loadingStatusFrame";
    loadingStatusOrigin.addChild (loadingStatusFrame);

    -place loading bar State-
    var loadingStatusBar:Sprite = new Sprite;
    loadingStatusBar.graphics.beginFill (0 x 000000, 1);
    loadingStatusBar.graphics.drawRect (0,0,751,751);
    loadingStatusBar.graphics.endFill ();
    loadingStatusBar.x = 2;
    loadingStatusBar.y = 2;
    loadingStatusBar.width =(loadingStatusWidth-4);
    loadingStatusBar.height = loadingStatusHeight-4;
    loadingStatusBar.name = "loadingStatusBar";
    loadingStatusOrigin.addChild (loadingStatusBar);

    -Place the text field-
    amountLoadedText = new TextField;
    amountLoadedText.defaultTextFormat = textFormatAmountLoaded;
    amountLoadedText.embedFonts = true;
    amountLoadedText.antiAliasType = AntiAliasType.NORMAL;
    amountLoadedText.selectable = true;
    amountLoadedText.text="100% LOADED.
    amountLoadedText.width = 100;
    amountLoadedText.height = 15;
    amountLoadedText.x = loadingStatusWidth-101;
    amountLoadedText.y = 2;
    loadingStatusOrigin.addChild (amountLoadedText);
    amountLoadedText.name = "amountLoadedText";

    }

    function showProgress(event:LoadingStatusEvent):void {}
    trace ("loading :") status / /, event.percentLoadedOfImage ");
    getChildByName("loadingStatusBar").width =(loadingStatusWidth-4) * event.percent LoadedOfImage;
    Tweener.addTween (getChildByName ("loadingStatusBar"), {width:(loadingStatusWidth-4) * event.percentLoadedOfImage, time: 5, transition: "easeInSmooth"});
    amountLoadedText.text = Math.round (event.percentLoadedOfImage) + "% LOADED";
    }

    }
    }
    }

  • How to stop Windows 7 taskbar of projection on the events? (no message bubbles)

    I'll explain it like this:

    I disabled all notifications in Windows 7.  I balloons you, Windows does not try and tell me when the bread is done, none of this.  However!  If I am away from programming in a window and another program or operation decides he needs some attention then slides the taskbar back up in the view on something I am working in the window.  It won't go away until I give it some attention as a child in need.
    What I want for the taskbar is to go away and stay away until I have A) move my mouse to the bottom of the screen or B) my Windows key press.
    How can this be accomplished?
    And if it is not able to do it, then how can I at least make sure the taskbar do not appear on top of everything else?  If at least he stayed in the background would be something.

    Yes windows snap is an easy way to view side by side or resize a window in full screen,

    The bad news is that windows does not remember that broken full-screen :(

    http://Windows.Microsoft.com/en-us/Windows7/products/features/snap

    This works best.

    If you have the taskbar in your opinion,

    Then use windows snap to the side of your screen so that it takes half of the window and drag it to fill the screen, close and reopen this window, windows don't forget the size, be careful not to hit the other side of the screen, because once your pointer hit the other side of your screen it will activate snap again and you will start again :)

    That's where it helps your question,

    Window fills your screen with the exception of the taskbar is where,

    Now if you use F11 mode full screen will cover the taskbar and notifications should not interrupt

    How this is different from what you have described is, F11 will take you to the to-do bar view and a little near window full screen,

    You will have a small edge (this is important), because it is the parameters of the window with scrollbars for scrolling horizontal and vertical,

    F11 using not will mess not setting up / but if you enlarge otherwise it will remove the borders it to the resolution will change,

    It's a quirk / little detail, but you will find it easier to friendly when dealing with alerts / opinion I google talk.

    A note more,.

    If you have changed the properties / Run options to run programs Maximized, change it to normal window, simply repeat snap windows to the side of your screen and drag the window to fill it with the taskbar in your opinion,.

    I hope this helps.

  • How can I remove selected Custom view (s) of the event viewer Console tree?

    I looked at the MMC Help on create and manage custom views.

    I can't find a way to remove the custom filter views in the Console tree, which can be found on the left side of the event viewer.

    How can I remove selected Custom view (s) when they serve no more values?

    Problem solved

    I asked this question because I was unable to see what was going on in the event viewer and I couldn't find help in mmc HTML Help. However, now I see what's happening and I can give you a solution to my own question.

    Cause

    If I connect to the computer as a user with administrator privileges, I am able to use the event viewer to create a custom view filter that can be used by all users who have access to the event viewer. If I fix remove a view filter custom Console tree, I can't delete it unless I'm logged in as the user who created it.

    Solution

    1. Log the computer as the user who created the custom view.
    2. Start Event Viewer
    3. Use the right-click of the mouse on a custom view filter selected in the Console tree, open the drop down menu.
    4. Delete appears fourth in the bottom of the menu if and only if you are logged on as the user who created this view.
    5. Select Remove to remove the filter to custom view.

    If Delete does not appear in the drop-down menu, then it may not possible you connect as the user who created the custom view.

  • How do you check if Validate is successful in the event Script

    Hello

    I am facing a problem with a script of the 'aftvalidate' event that retrieves the data from the Tsegdata table. The script is written to a file as expected. But I want to put a condition above. I want to run the Script event only if the Validation is successful (that is to say the fish is Orange). I thought that we can use the lngProcState as "11" for success. He is yet to come as "11" even after that validation failed (IE fish is grey) and therefore running the script of the event. Is there another function that I can make use of, if this isn't the right way to test whether validation succeeded. ?

    Another thing - we have all the features that I use in the script to delete the imported data? I want to use it in the aftvalidate script once the validation is successful and generates the data file.

    Thanks in advance.

    PM

    If you want users to export data, but not load, you can try to set option adapter "Allows to load" false.

    With this configuration, users will be able to click on Export but they won't get a LOADING popup.

  • How can you correct error did not find the mozilla runtime

    the error comes when I try to get on the internet

    In my view, this usually indicates some sort of damage in the Firefox program folder. Here's what I suggest:

    Clean reinstall it

    We use this name, but it isn't about deleting your settings, this is to ensure that the program, files are clean (not incompatible, corrupt or exotic code files). As described below, this process does not disrupt your existing settings. Don't uninstall NOT Firefox, that does not need.

    (A) download a fresh Installer for Firefox 40.0.2 of https://www.mozilla.org/firefox/all/ in an ideal location. (Scroll down your preferred language).

    (B) the release of Firefox (if any).

    (C) to rename the program folder, either:

    (Windows 32-bit folder names)

    C:\Program Files\Mozilla Firefox
    

    TO

    C:\Program Files\OldFirefox
    

    (Windows 64-bit folder names)

    C:\Program Files (x86)\Mozilla Firefox
    

    TO

    C:\Program Files (x86)\OldFirefox
    

    (D) to run the installation program that you downloaded in the #1. It should automatically connect to your existing settings.

    Firefox will start normally now?

    Note: Some plugins can only exist in this OldFirefox file. If it is missing something essential, present in these files:

    • \OldFirefox\Plugins
    • \OldFirefox\browser\plugins

Maybe you are looking for