答案 0 :(得分:3)
你的主要问题是你在绘画方法中调用resize(...)
并且没有调用超级绘画方法。话虽如此,我的建议是:
例如
import javax.swing.JApplet;
import java.util.*;
import java.awt.*;
public class Shapes extends JApplet {
@Override
public void init() {
add(new ShapesPanel());
}
}
class ShapesPanel extends JPanel {
private Random rand = new Random();
// Declare size constants
final int circleMax = 160,circleMin = 40; // circle max and min diameter
final int locMaxX = 360, locMaxY = 260;
int radiusSize = 0, locationx = 0,locationy = 0 ;
public ShapesPanel() {
radiusSize = (rand.nextInt(circleMax)+ circleMin);
locationx =20 ;//rand.nextInt(locMaxX)+ 20;
locationy =20 ;// rand.nextInt(locMaxY) + 20;
}
@Override
protected void paintComponent (Graphics page) {
super.paintComponent(page);
// Draw the circle 1
page.drawOval(locationx, locationy, radiusSize,radiusSize);
}
}
答案 1 :(得分:3)
传递给您的组件的Graphics
上下文是一个共享资源,这意味着它将包含之前绘制的内容。
在进行任何自定义绘制之前未能调用super.paint
,您已阻止applet执行其设计的许多关键任务(其中一项是用Graphics
上下文填充背景色。)
请查看Painting in AWT and Swing和Performing Custom Painting,了解有关绘画在Swing和AWT中的工作原理的详细信息。
现在,您只需致电super.paint
,但通常不鼓励覆盖paint
等顶级容器的JApplet
方法,它实际上包含JRootPane
,其中包含contentPane
,可能会在绘画过程中出现问题。
更好的解决方案是从JPanel
开始,覆盖它的paintComponent
方法(首先调用super.paintComponent
)并在那里执行自定义绘画。然后,您可以将其添加到您想要的容器
你还应该避免调用任何可能导致使用paint方法进行重绘请求的方法,这将导致一个永无止境的重绘循环,这将消耗你的CPU周期并使你的系统瘫痪
例如......
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;
import javax.swing.JApplet;
import javax.swing.JPanel;
import test.Shapes.TestPane;
public class Shapes extends JApplet {
@Override
public void init() {
super.init();
add(new TestPane());
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
Random rand = new Random();
// Declare size constants
final int circleMax = 160, circleMin = 40; // circle max and min diameter
final int locMaxX = 360, locMaxY = 260;
int radiusSize = 0, locationx = 0, locationy = 0;
// Declare variables
radiusSize = (rand.nextInt(circleMax) + circleMin);
locationx = 20;//rand.nextInt(locMaxX)+ 20;
locationy = 20;// rand.nextInt(locMaxY) + 20;
// Draw the circle 1
g2d.drawOval(locationx, locationy, radiusSize, radiusSize);
g2d.dispose();
}
}
}
考虑到几乎所有的浏览器都在积极地禁用它们以及它们的开发带来的复杂性,我现在还会质疑JApplet
的使用情况。