我目前有JFrame
,其中包含Applet
和JTabbedPane
。每当在选项卡式窗格上更新JLabel
时,小程序向下移动一个像素,这比您想象的更烦人。有什么办法可以防止这种情况发生吗?
以下是我正在使用的一个示例(有我的问题,只需将鼠标悬停在“Foo”上)[启动applet&大约需要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();
}
});
}
}
答案 0 :(得分:1)
applet.setLayout(null);
applet.setBounds(0,0,770,530);
这将强制小程序的位置始终为0,0。只需在applet.start()
之前将代码放在某处