Проблема с рисованием

#java #graphics #applet #drawing

#java #графика #апплет #рисование

Вопрос:

На данный момент предполагается, что следующий код нарисует окружность, нарисованную поверх черного холста. К сожалению, это не так (= Я что-то пропустил?

Заранее спасибо…

 import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.applet.*;
import java.awt.Graphics.*;



public class IdrawApplet extends Applet  {  


    int mosX;
    int mosY;
    Panel pGadgets;
    Canvas myCanvas;
    Label lRed;
    TextField tfRed;
    TextField tfGreen;
    TextField tfBlue;
    Label lGreen;
    Label lBlue;

    Graphics g;

  public void init() {

    g = getGraphics();
    lRed = new Label("Red-value: ");
    lBlue = new Label("Blue-value: ");
    lGreen = new Label("Green-value: ");
    tfRed = new TextField();
    tfRed.setText("255");
    tfGreen = new TextField();
    tfGreen.setText("255");
    tfBlue = new TextField();
    tfBlue.setText("255");

    pGadgets = new Panel();
    pGadgets.setLayout(new GridLayout(1, 6, 5, 5));
    add(pGadgets);
    pGadgets.add(lRed);
    pGadgets.add(tfRed);
    pGadgets.add(lGreen);
    pGadgets.add(tfGreen);
    pGadgets.add(lBlue);
    pGadgets.add(tfBlue);

    myCanvas = new Canvas();
    myCanvas.setBackground(new Color(0,0,0));
    myCanvas.setBounds(0, 0, 600, 400);

    add(myCanvas);
    myCanvas.addMouseMotionListener(new MouseMotionListener() {

        public void mouseMoved(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub
            paint(g);

        }
    });


  }

  public void paint(Graphics g) {
      g.setColor(Color.green);
      g.fillOval(mosX, mosY, 30, 30);

      }





}
  

Комментарии:

1. Спасибо за «редактировать». Код не отображался так, как ожидалось.

2. Не похоже, что mosX и mosY где-либо установлены.

3. Изменено на: public void mouseDragged(MouseEvent e) { // Заглушка автоматически сгенерированного метода TODO mosX = e.getX(); mosY = e.getY(); paint(g); }По-прежнему ничего…

4. Не используйте paint() то, что предназначено для внутреннего использования. Вы должны вызвать repaint() . Как и сейчас, вы вызываете paint() с null , поскольку g никогда не устанавливается.

5. Кроме того, смотрите мой ответ. Вы хотите рисовать на холсте, а не на компоненте

Ответ №1:

Две вещи:

 public void mouseDragged(MouseEvent e) 
{
   mosX = e.getX();
   mosY = e.getY();
   repaint(); //NOT paint(g);
}

//...
public void paint(Graphics g) 
{
    //draw on the canvas not on the component 
    //since the canvas gets drawn over it
    Graphics g2 = myCanvas.getGraphics();
    g2.setColor(Color.green);
    g2.fillOval(mosX, mosY, 30, 30);
}
  

Если у вас есть что-то более сложное, вам следует создать подкласс Canvas и переопределить его paint() метод.

Ответ №2:

Попробуйте это:

 public void mouseDragged(MouseEvent e) 
{
    mosX = e.getX();
    mosY = e.getY();

    repaint();
}
  

Проблема заключалась в том, что вы не обновляли свои координаты для mouseDragged события. Также вместо того, чтобы вызывать paint() напрямую, вам следует вызвать repaint() . Вызов repaint() гарантирует, что ваш paint() вызов будет выполнен автоматически.

Редактировать:

Чтобы нарисовать объект на холсте, переопределите paint() Canvas объект.

 myCanvas = new Canvas()
{
    public void paint(Graphics g) 
    {
        g.setColor(Color.green);
        g.fillOval(mosX, mosY, 30, 30);
    }    
};
  

Теперь ваш метод, перехваченный мышью, становится :

 public void mouseDragged(MouseEvent e) 
{
    mosX = e.getX();
    mosY = e.getY();

    myCanvas.repaint();
}
  

Комментарии:

1. Теперь он обновляет координаты. Но все это по-прежнему происходит за MyCanvas. Хотя я добавил своего слушателя на холст.

2. @bodycount PP, возможно, вам придется использовать JLayeredPane для этого. Также вам может понадобиться g.fillOval((int)myCanvas.getLocation().getX() mosX, (int) myCanvas.getLocation().getY() mosY, 30, 30);

3. @bodyCountPP Вы хотите рисовать на холсте, а не на компоненте. Смотрите мой обновленный ответ.