Это правильный способ выведения изображения?
Пытаюсь написать программу которая должна выводить изображения шариков на задний фон. Шарики могут стоять, перемещаться или пульсировать.
Пытаюсь разобраться каким образом я смогу выводить это всё на экран.
Написал такой набросок. В нём я создаю один Label и на нём рисую изображения из файлов.
У меня вопрос, не будет ли программа тормозить если шариков будет около 100.
У меня был ещё второй вариант этой же программы. Он отличался тем, что я создавал label для каждого шарика. Тоже всё работало. Какой вариант предпочтительней?
Много шариков на одном Label или много Label на одном Plane?
И ещё, эту программу я писал с помощью подсказок (использовал некоторые непонятные мне методы) Подскажите, что делает метод bf.flush()? И метод g2.dispose().
Я его выключаю всё равно программа работает. Но не зря же мне посоветовали его использовать?
И строку g2.drawImage(bf2, 128, 128, myLabel1) можно поменять на g2.drawImage(bf2, 128, 128, this), не могу понять на что указывает последний параметр?
Спасибо
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class TextTwo extends JFrame implements ActionListener {
JPanel myPanel;
JLabel myLabel1;
BufferedImage bf,bf2,bf3;
Timer myTimer;
public boolean grow = true;
public int scale = 64;
boolean upper = true;
public int shift = 0;
boolean isRight = true;
TextTwo(){
try
{
bf = ImageIO.read(getClass().getResource("Ball64_1.png"));
bf2 = ImageIO.read(getClass().getResource("Ball64_2.png"));
bf3 = ImageIO.read(getClass().getResource("Pole1.png"));
bf.flush();
bf2.flush();
bf3.flush();
}
catch (IOException ez){}
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600,600);
myPanel = new JPanel();
myPanel.setLayout(null);
myPanel.setBounds(0,0,600,600);
add(myPanel);
myLabel1 = new JLabel();
myLabel1.setBounds(0,0, 600,600);
myLabel1.setOpaque(true);
myPanel.add(myLabel1);
setVisible(true);
myTimer = new Timer(10,this);
myTimer.start();
}
public static void main(String[] args) {
TextTwo tt = new TextTwo();
}
@Override
public void actionPerformed(ActionEvent e) {
if (upper) scale+=1;
else scale -=1;
if (scale>=70) upper = false;
else if (scale<=58) upper = true;
if (isRight) shift+=8;
else shift -=8;
if (isRight && shift>=512) isRight = false;
if (!isRight && shift<=0) isRight = true;
BufferedImage sr = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = sr.createGraphics();
g2.drawImage(bf3,0,0,myLabel1);
g2.drawImage(bf2, shift, 0, myLabel1);
g2.drawImage(bf2, 128, 64, myLabel1);
g2.drawImage(bf2, 256, 64, myLabel1);
g2.drawImage(bf2, 64, 128, myLabel1);
g2.drawImage(bf2, 128, 128, myLabel1);
g2.drawImage(bf2, 256, 128, this);
g2.drawImage(bf.getScaledInstance(scale, scale, Image.SCALE_SMOOTH), 64+(64-scale)/2, 64+(64-scale)/2, myLabel1);
//g2.dispose();
myLabel1.setIcon(new ImageIcon(sr));
}
}


