Я читаю Head First Java, но я озадачен этой программой - PullRequest
2 голосов
/ 15 марта 2012
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class twobuttons
{
    int x=70;
    int y=70;

    public static void main(String args[])
    {
        twobuttons gui =new twobuttons();
        gui.go();
    }

    public void go()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        mydraw drawpanel = new mydraw();

        frame.getContentPane().add(drawpanel);
        frame.setSize(300,300);
        frame.setVisible(true);

        for(int i=0;i<130;i++)
        {
            x++;
            y++;

            drawpanel.repaint();
            try
            {
                Thread.sleep(50);
            }
            catch(Exception ex)
            {

            }
        }

    }
    class mydraw extends JPanel
    {

        public void paintconponent(Graphics g)
        {
            g.setColor(Color.green);
            g.fillOval(x, y, 40, 40);
        }
    }
}

это код из Head First Java, глава 12, стр. 384. (Я читаю китайское издание, возможно, оно не на той же странице в английском издании.) В случае успеха должна быть запущена точкаоднако из левого угла в правый угол я ничего не вижу в окне.

Ответы [ 3 ]

5 голосов
/ 15 марта 2012

У вас есть опечатка в классе рисования (paintconponent => paintComponent).Таким образом, вы не переопределяете поведение суперкласса JComponent.Попробуйте это:

class mydraw extends JPanel
{

    @Override
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.green);
        g.fillOval(x, y, 40, 40);
    }
}
4 голосов
/ 15 марта 2012

Если этот фрагмент буквально скопирован из книги, я бы выбросил книгу

  • Операции Swing должны выполняться на EDT, поэтому для метода main требуется EventQueue.invokeLater (или аналогичный)
  • Вызов Thread.sleep на тот же Thread, где выполняется рисование, работать не будет.

StackOverflow заполнен вопросами, почему Thread.sleep не работает на EDT, и возможными обходными путями. В этом случае я бы использовал Swing Timer для перемещения точки и запуска перерисовки

2 голосов
/ 15 марта 2012

1) никогда не использовать Thread.sleep (int) во время EDT, эта строка кода вызывает мерцание или зависание графического интерфейса Swing, пример с зависанием здесь

2) Необходимо запустить Swing GUIв исходные потоки

3) использовать Swing Time r для анимации или приостановки Swing GUI

4) learn Java Naming Convention

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...