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.