如何重新定位applet查看器窗口?

使用Eclipse制作Java Applet。 每次从IDE运行它时,applet查看器显示在左上角的(0,0)处。 如何在开发过程中可编程地将其更改为屏幕中间? 我知道在浏览器中部署时,我们无法从applet内部更改窗口,因为html确定了位置。

与其他海报相比,我认为这是一个毫无意义的练习,并且更喜欢他们建议制作混合应用程序/小程序以使开发更容易。

OTOH – ‘我们有技术’。 applet查看器中applet的顶级容器通常是一个Window 。 获取对它的引用,您可以将其设置在您希望的位置。

尝试这个(刺激性的)小例子。

 //  import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class CantCatchMe extends JApplet { Window window; Dimension screenSize; JPanel gui; Random r = new Random(); public void init() { ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent ae) { moveAppletViewer(); } }; gui = new JPanel(); gui.setBackground(Color.YELLOW); add(gui); screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // change 2000 (every 2 secs.) to 200 (5 times a second) for REALLY irritating! Timer timer = new Timer(2000, al); timer.start(); } public void start() { Container c = gui.getParent(); while (c.getParent()!=null) { c = c.getParent(); } if (c instanceof Window) { window = (Window)c; } else { System.out.println(c); } } private void moveAppletViewer() { if (window!=null) { int x = r.nextInt((int)screenSize.getWidth()); int y = r.nextInt((int)screenSize.getHeight()); window.setLocation(x,y); } } } 

有趣的问题。

我没有找到一种可靠的方式来影响AppletViewer,不是没有在Windows上使用脚本从批处理文件模式启动它,甚至没有那么好用。

另一种方法是编写测试代码,以便Applet在JFrame中启动,您可以轻松地将其放在中心位置。

在Applet中添加一个main方法:

  public class TheApplet extends JApplet { int width, height; public void init() { width = getSize().width; height = getSize().height; setBackground( Color.black ); } public void paint( Graphics g ) { g.setColor( Color.orange ); for ( int i = 0; i < 10; ++i ) { g.drawLine( width / 2, height / 2, i * width / 10, 0 ); } } public static void main(String args[]) { TheApplet applet = new TheApplet(); JFrame frame = new JFrame("Your Test Applet"); frame.getContentPane().add(applet); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(640,480); frame.setLocationRelativeTo(null); frame.setVisible(true); applet.init(); } } 

这应该有效,除非我遗漏了一些东西 - 我更新了我在我的机器上运行的工作代码。