Как переместить изображение внутри JApplet ..?
Практически точно так же, как вы можете сделать это в JFrame
, JComponent
или JPanel
или...
Или, другими словами, ничего не имеет отношения к апплетам и все связано с Graphics2D
.Для получения дополнительной информации см. 2D Graphics Trail Учебного руководства по Java.
Когда вы поймете, как переместить изображение и нарисовать его в Graphics2D
, реализуйте эту логику вJComponent
или JPanel
paintComponent(Graphics)
и поместите компонент с движущимся изображением в JApplet
или JFrame
(или JPanel
и т. Д.).
Длясторона анимации, используйте javax.swing.Timer
, как показано в этом примере.Этот пример не расширяет ни один компонент.Вместо этого он создает BufferedImage
и добавляет его к JLabel
, отображаемому для пользователя.Когда таймер срабатывает, код захватывает объект Graphics
изображения и переходит оттуда к отскакивающим линиям.
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;
class LineAnimator {
public static void main(String[] args) {
final int w = 640;
final int h = 480;
final RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON
);
hints.put(
RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY
);
final BufferedImage bi = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
final JLabel l = new JLabel(new ImageIcon(bi));
final BouncingLine[] lines = new BouncingLine[100];
int factor = 1;
for (int ii=0; ii<lines.length; ii++) {
lines[ii] = new BouncingLine(w*factor,h*factor);
}
final Font font = new Font("Arial", Font.BOLD, 30);
ActionListener al = new ActionListener() {
int count = 0;
long lastTime;
String fps = "";
private final BasicStroke stroke = new BasicStroke(6);
public void actionPerformed(ActionEvent ae) {
count++;
Graphics2D g = bi.createGraphics();
g.setRenderingHints(hints);
g.setColor(new Color(55,12,59));
g.fillRect(0,0,w,h);
g.setStroke(stroke);
for (int ii=0; ii<lines.length; ii++) {
lines[ii].move();
lines[ii].paint(g);
}
if ( System.currentTimeMillis()-lastTime>1000 ) {
lastTime = System.currentTimeMillis();
fps = count + " FPS";
count = 0;
}
g.setColor(Color.YELLOW);
g.setFont(font);
g.drawString(fps,5,h-5);
l.repaint();
g.dispose();
}
};
Timer timer = new Timer(25,al);
timer.start();
JOptionPane.showMessageDialog(null, l);
//System.exit(0);
timer.stop();
}
}
class BouncingLine {
private final Color color;
private static final Random random = new Random();
Line2D line;
int w;
int h;
int x1;
int y1;
int x2;
int y2;
BouncingLine(int w, int h) {
line = new Line2D.Double(random.nextInt(w),random.nextInt(h),random.nextInt(w),random.nextInt(h));
this.w = w;
this.h = h;
this.color = new Color(
random.nextInt(255)
,random.nextInt(255)
,random.nextInt(255)
,64+random.nextInt(128)
);
x1 = (random.nextBoolean() ? 1 : -1);
y1 = (random.nextBoolean() ? 1 : -1);
x2 = -x1;
y2 = -y1;
}
public void move() {
int tx1 = 0;
if (line.getX1()+x1>0 && line.getX1()+x1<w) {
tx1 = (int)line.getX1()+x1;
} else {
x1 = -x1;
tx1 = (int)line.getX1()+x1;
}
int ty1 = 0;
if (line.getY1()+y1>0 && line.getY1()+y1<h) {
ty1 = (int)line.getY1()+y1;
} else {
y1 = -y1;
ty1 = (int)line.getY1()+y1;
}
int tx2 = 0;
if (line.getX2()+x2>0 && line.getX2()+x2<w) {
tx2 = (int)line.getX2()+x2;
} else {
x2 = -x2;
tx2 = (int)line.getX2()+x2;
}
int ty2 = 0;
if (line.getY2()+y2>0 && line.getY2()+y2<h) {
ty2 = (int)line.getY2()+y2;
} else {
y2 = -y2;
ty2 = (int)line.getY2()+y2;
}
line.setLine(tx1,ty1,tx2,ty2);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(color);
//line.set
g2.draw(line);
}
}
Обновление 1
Я хочу сделать это в JApplet (1), используя изображение (2), возможно ли это (3)?
- Примеры mKorbel и меня содержат либоизображение в
JLabel
или пользовательский рендеринг в JPanel
.В нашем случае мы добавили компоненты к JOptionPane
& JFrame
.Любой пример может быть так же легко добавлен к JApplet
, или JDialog
, или как часть другой панели, или ... См. Компоновка компонентов в контейнере урок & ИспользованиеКонтейнеры верхнего уровня в руководстве по Java для получения более подробной информации. - Вместо звездочек или линий в наших примерах, ... нарисуйте свое изображение.Мой пример заходит так далеко, что демонстрирует, как заставить положение колебаться в пределах контейнера.
- Конечно, это возможно, но "Батареи не включены".Наше намерение состоит в том, чтобы дать вам некоторые идеи, которые вы можете затем адаптировать к вашему апплету прыгающего мяча.Я сомневаюсь, что кто-то собирается создать для вас пример, используя шарики, в апплете.Хотя, если вы опубликуете SSCCE , который показывает ваши намерения и то, что вы пытались, я (и другие) часто использовал этот источник.Если вы хотите получить более конкретные ответы, задайте более конкретный SSCCE.;)