imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 18.12.2007, 03:28     # 1
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
Простой апплет на Java

По сути в объекте должно быть несколько объектов-кругов, которые будут двигаться до стенки и отскакивать, каждый в своем потоке.

Проблема в том, что не знают как перерисовавыть их в апплете, как сделано - они перирисовыются только при изменинии размеров апплетов.

И еще хотел отлавлитвать событие о изменении размеров окна и обновлять предполагамые размеры для кругов, но тоже не пашет.

Можно сказать, что первая прога на яве, так что код далек от совершенства.

PHP код:
import java.awt.*;
import java.applet.*;

public class 
Circle extends Component implements Runnable{
    
Color color
    
int radiusposXposYvelocity;
    
Dimension dim;
    
Graphics gr;

    public 
Circle(int redint greenint blueint radiusint posXint posYint velocityDimension dimGraphics gr) {
        
this.color = new Color(redgreenblue);
        
this.radius radius;
        
this.posX posX;
        
this.posY posY;
        
this.velocity velocity;
        
this.dim dim;
        
this.gr gr;
    }

    public 
void move() {
        
posX posX velocity;
        if ((
velocity && posX radius >= dim.getWidth()) ||
            (
velocity && posX radius <= 0))
        {
            
velocity = -velocity;
        }
    }
    
    public 
void paint(Graphics g)
    {
        
g.setColor(color);
        
g.fillOval(posXposYradius*2radius*2);
    }
    
    public 
void run()
    {
        
Thread thisThread Thread.currentThread();
        
Graphics g getGraphics();
        while (
true) {
            
move();
            
repaint();
            
            try {
                
Thread.currentThread().sleep(100);
            } catch (
InterruptedException e) {}
        }
    }
    
    public 
void updateDim(Dimension dim)
    {
        
this.dim dim;
    }

PHP код:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class 
Race extends Applet implements KeyListener{
    
Circle []c;
    
Thread []t;
    
Dimension dim;    
    
int sizewidthheightradius;
    
    public 
void destroy() {
        
super.destroy();
    }

    public 
void init() {
        
size 10;
        
width 800;
        
height 600;
        
radius 10;
        
        
setSize(widthheight);
        
dim = new Dimension(widthheight);
        
        
= new Circle[size];
        
= new Thread[size];
        
        for(
int i 0sizei++ ){
            
c[i] = new Circle((int)(Math.random()*255), (int)(Math.random()*255), 
                (int)(
Math.random()*255), radius0, (height/size-radius)*(i+1), 20dimgetGraphics());
            
t[i] = new Thread(c[i]);
        }
        
        
addMouseListener(new MouseAdapter()
        {
            public 
void mousePressed(MouseEvent m_e)
            {
                for(
int i 0sizei++ ){
                    
c[i].updateDim(getSize());
                }
            }
        });
        
    }

    public 
void paint(Graphics g) {
        
super.paint(g);
        
g.drawString("kvarx"width 150height 5);
        
        for (
int i 0sizei++)
        {
            
c[i].paint(g);
        }
    }

    public 
void start() {
        for (
int i 0sizei++)
        {
            
t[i].start();
        }
    }
    
    public 
void stop() {
        
super.stop();
    }
    
    public 
void keyPressed(KeyEvent k_e)
    {
    
    }
    
    public 
void keyTyped(KeyEvent k_e)
    {
    
    }
    
    public 
void keyReleased(KeyEvent k_e)
    {
    
    }

Kvarx вне форума  
Старый 18.12.2007, 12:30     # 2
EjikVTumane
Member
 
Аватар для EjikVTumane
 
Регистрация: 18.04.2002
Адрес: Ф туманах Новосибирска...
Сообщения: 378

EjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собойEjikVTumane Имеются все основания чтобы гордиться собой
Ты не прав в следующем: отрисовка идет в методе paint этот метод вызывается только и только тогда когда было известно, что состояние компонента обновилось и его надо перерисовать.
Соответственно у тебя и получается, что он перерисовывается только когда ты изменяешь размер.
Самое простое изменение, которое можно сюда внести - это с определенной переодичностью дергать метод repaint() который будет оповещать о том, что окно апплета надо перерисовать.

Вообще есть немного более красивый вариант - у тебя объекты Circle в любом случае наследуются от Component, поэтому не риуй руками их каждый раз и просто добавляй их внутрь окна апплета (правдо желательно все же использовать lightweight компоненты в качестве базового класса - JComponent)
предварительно у апплета убери лэйаут setLayout(null) и просто меняй координаты объектов Circle, помещенных в окно апплета. Таким образом никакого кода дополнительно отвечающего за перерисовку не потребуется.

Также поток на каждый объект - это расточительство используй один поток для обработки всех объектов.
Вообще в пятой яве появились новые средства для работы с потоками - можешь ознакомиться с пакетом java.util.concurrent.*.

Где-то так...
__________________
Трофейные шляпки от гвоздей: ○○○○○○○○
EjikVTumane вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 16:35.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.