#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 Вы хотите рисовать на холсте, а не на компоненте. Смотрите мой обновленный ответ.