简体   繁体   中英

Applet re-positioning when a JLabel is changed

I currently have a JFrame which contains an Applet and a JTabbedPane . Whenever a JLabel is updated on the tabbed pane, the applet shifts down one pixel, which is more annoying than you'd think. Is there anything I can do to prevent this?

Here's an example of what I'm working with (with my problem, just hover your mouse over "Foo") [it takes about 10-15 seconds to start the applet & music will play once it has started, the button will disable it (the music note)]:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.regex.*;

public class ToolkitFrame extends JFrame {

    public void construct() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(getApplet(), BorderLayout.CENTER);
        add(getTabs(), BorderLayout.EAST);
        setLocationRelativeTo(null);
        pack();
        setVisible(true);
    }

    public JTabbedPane getTabs() {
        tabs = new JTabbedPane();
        tabs.add(getTab());
        return tabs;
    }

    public JPanel getTab() {
        label = new JLabel("Foo");
        label.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent event) {
                label.setText("Bar");
            }

            @Override
            public void mouseExited(MouseEvent event) {
                label.setText("Foo");
            }

        });

        JPanel panel = new JPanel();
        panel.add(label);
        return panel;
    }

    public Applet getApplet() {
        Applet applet = null;
        try {
            String url = "http://oldschool59.runescape.com/";
            String source = getPageSource(new URL(url));
            Matcher matcher = Pattern.compile("code=(.*) ").matcher(source);
            if (matcher.find()) {
                LoaderStub stub = new LoaderStub(Pattern.compile("<param name=\"([^\\s]+)\"\\s+value=\"([^>]*)\">"), source);
                String appletClass = matcher.group(1);
                stub.setCodeBase(new URL(url));
                stub.setDocumentBase(new URL(url));
                try {
                    applet = (Applet) new URLClassLoader(new URL[] {
                        new URL(url + "gamepack.jar")
                    }).loadClass(appletClass.replaceAll(".class", "")).newInstance();
                    applet.setBackground(Color.BLACK.darker());
                    applet.setPreferredSize(new Dimension(765, 503));
                    applet.setStub(stub);
                    applet.init();
                    applet.start();
                    applet.requestFocusInWindow();
                    return applet;
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        return applet;
    }

    class LoaderStub implements AppletStub {

        private Map<String, String> parameters = new HashMap<String, String>();

        private URL documentBase;
        private URL codeBase;

        public LoaderStub(Pattern parameterPattern, String frameSource) {
            Matcher param = parameterPattern.matcher(frameSource);
            while (param.find()) {
                String key = param.group(1);
                String value = param.group(2);
                parameters.put(key, value);
            }
        }

        public void setDocumentBase(URL documentBase) {
            this.documentBase = documentBase;
        }

        public void setCodeBase(URL codeBase) {
            this.codeBase = codeBase;
        }

        @Override
        public boolean isActive() {
            return true;
        }

        @Override
        public URL getDocumentBase() {
            return documentBase;
        }

        @Override
        public URL getCodeBase() {
            return codeBase;
        }

        @Override
        public String getParameter(String name) {
            return parameters.get(name);
        }

        @Override
        public AppletContext getAppletContext() {
            return null;
        }

        @Override
        public void appletResize(int width, int height) {

        }

    }

    public static String getPageSource(URL url) throws IOException, InterruptedException {
        URLConnection uc = url.openConnection();
        uc.addRequestProperty("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        uc.addRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        uc.addRequestProperty("Accept-Encoding", "gzip,deflate");
        uc.addRequestProperty("Accept-Language", "en-gb,en;q=0.5");
        uc.addRequestProperty("Connection", "keep-alive");
        uc.addRequestProperty("Host", "www.runescape.com");
        uc.addRequestProperty("Keep-Alive", "300");
        uc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6");
        DataInputStream di = new DataInputStream(uc.getInputStream());
        byte[] tmp = new byte[uc.getContentLength()];
        di.readFully(tmp);
        di.close();
        return new String(tmp);
    }

    private JLabel label;
    private JTabbedPane tabs;

    private static final long serialVersionUID = -6757985823719418526L;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ToolkitFrame().construct();
            }

        });
    }

}
        applet.setLayout(null);
        applet.setBounds(0,0,770,530);

This will force the position of the applet at 0,0 at all times. Just slip this code in somewhere before applet.start()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM