1

現在、JFrameと を含む がありAppletますJTabbedPane。タブ付きペインでa が更新されるたびJLabelに、アプレットは 1 ピクセル下に移動します。これは、想像以上に厄介です。これを防ぐためにできることはありますか?

これが私が取り組んでいるものの例です(私の問題では、マウスを「Foo」の上に置くだけです)[アプレットを開始するのに約10〜15秒かかり、開始すると音楽が再生され、ボタンはそれを無効にします(音符)]:

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();
            }

        });
    }

}
4

1 に答える 1

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

これにより、アプレットの位置が常に 0,0 に強制されます。このコードをapplet.start()の前のどこかに挿入するだけです

于 2013-03-17T05:08:26.437 に答える