Wątek przeniesiony 2015-02-26 14:53 z Java przez bogdans.

Aplet obiekt nie odbija się przy zetknięciu z krawędzią

0

Witam, mam problem, obiekt nie odbija się przy zetknięciu z krawędzią okna, tak jakby cały czas ten warunek

if(y>=getHeight()-95 )

nie był spełniony a jest, proszę o pomoc

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JApplet;

/**
 *
 * @author Damian
 */
public class Nowy extends JApplet {
    
    int x =0, y=0;

    /**
     * Initialization method that will be called after the applet is loaded into
     * the browser.
     */
    public void init() {
        setBackground(Color.LIGHT_GRAY);
        setSize(500, 400);
        // TODO start asynchronous download of heavy resources
    }
    
    public void paint(Graphics g){
        int dy =3;
         y+=dy;
        if(y>=getHeight()-95 )
            dy = -dy;
        try {
            Thread.sleep(20);
        }catch(InterruptedException e){}
        repaint();
        g.clearRect(0, 0, getWidth(), getHeight());
        Font f  = new Font("SanSerif", Font.ITALIC, 22);
        g.setFont(f);
        String s ="Wesoły Bałwan ";
        g.setColor(Color.blue);
        g.drawString(s, 10,20);
        g.setColor(Color.BLACK);
        g.fillRect(x+(getWidth()/2)-5 , y+(getHeight()/2)-5 , 15, 15);
        g.drawLine(x+(getWidth()/2) -10, y+(getHeight()/2) +10, x+(getWidth()/2) +15, y+(getHeight()/2) +10 );
        g.setColor(Color.WHITE);
        g.fillOval(x+(getWidth()/2) -10, y+(getHeight()/2) +10, 25, 20);
        g.fillOval(x+(getWidth()/2) -20, y+(getHeight()/2) +30, 45, 35);
        g.fillOval(x+(getWidth()/2) -30, y+(getHeight()/2) +65, 65, 45);
}
    // TODO overwrite start(), stop() and destroy() methods
}
0

Ten fragment

        try {
            Thread.sleep(20);
        }catch(InterruptedException e){}
        repaint();

nie ma prawa być w metodzie paint.
W klasie dziedziczącej po JApplet rysuj raczej w metodzie paintComponent.
Masz dziwny wzór na współrzędne y-owe rysowanych obiektów. Rysujesz od połowy obszaru apletu w dół, daleko poza ten obszar. Usuń z każdego wzoru składnik getHeight()/2.
Rozmiar apletu powinieneś ustalać w pliku HTML, nie w kodzie apletu. Przeglądarka przydzieli tyle miejsca ile zamówisz w tagu applet.

<applet code="Nowy" width="500" height="400"></applet>
0

Rozmiar w kodzie HTML już ustawiłem wcześniej. Rysowanie chciałem rozpocząć od środka obszaru dlatego y zaczynają się od getHeight()/2.
Co oznacza daleko po za ten obszar, obiektu dopiero przy poruszaniu wychodzą za ten obszar ? Gdzie umieścić instrukcję z try i catch jeśli nie w metodzie paint ?

0

Największa wartość y to getHeight()-95. Dla takiego y y+(getHeight()/2) +65 = getHeight()-95+(getHeight()/2) +65 = 1.5*getHeight()-30 = 570, taki punkt leży daleko poza apletem.
Zadeklaruj zmienną dy w innym miejscu. Zmiany y powinny być wykonywane w innym wątku, masz wtedy możliwość uruchomienia i zatrzymania skaczącego bałwanka. W paintComponent powinny być tylko polecenia rysujące - font f lepiej konstruować tylko raz.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Nowy extends JApplet
{
    private int x = 0, y = 0;
    private int dy = 3;
    private Font f  = new Font("SanSerif", Font.ITALIC, 22);
    private Timer timer = null;
    public void init()
    {
        setLayout(new BorderLayout(2,2));
        add(new Panelik(),BorderLayout.CENTER);
        JPanel buttonsPanel = new JPanel();
        add(buttonsPanel,BorderLayout.SOUTH);
        JButton b = new JButton("Start");
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                timer.start();
            }
        });
        buttonsPanel.add(b);     
        b = new JButton("Stop");
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                timer.stop();
            }
        });           
        buttonsPanel.add(b);
        add(buttonsPanel,BorderLayout.SOUTH);         

        timer = new Timer(20,new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                y+=dy;
                if(y >= getHeight() - 95)
                {
                    dy*=-1;
                }
                if(y<0)
                {
                    dy*=-1;
                }
                repaint();
            }
        });
        timer.setInitialDelay(0);
    }
    class Panelik extends JPanel
    {
        public Panelik()
        {
            setBackground(Color.LIGHT_GRAY);
        }
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);            
            g.setFont(f);
            String s ="Wesoły Bałwan";
            g.setColor(Color.BLUE);
            g.drawString(s, 10,20);
            g.setColor(Color.BLACK);
            g.fillRect(x+(getWidth()/2)-5 , y-5 , 15, 15);
            g.drawLine(x+(getWidth()/2) -10, y +10, x+(getWidth()/2) +15, y + 10 );
            g.setColor(Color.WHITE);
            g.fillOval(x+(getWidth()/2) -10, y + 10, 25, 20);
            g.fillOval(x+(getWidth()/2) -20, y + 30, 45, 35);
            g.fillOval(x+(getWidth()/2) -30, y + 65, 65, 45);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1