[JAVA] - problem z canvasem

0

Czesc,
Jestem raczkujacy w javie i mam taki o to problem, ze chce dziedziczyc po klasie Canvas, i dopisac do niej pare metod. Chcialem dopisac metode rysujujaca cos na moim canvasie np. prostokat. Jednak rysowana grafika Od razu znika po narysowaniu. Jak zrobic zeby byla widoczna na dluzej?? Oto moj kod:

class GCanvas extends Canvas 
{
    
  public void paint(Graphics g) 
  {
  }

   public void testDraw()
  {
        Graphics g = this.getGraphics();
        g.setColor(Color.BLACK);
        g.drawRect(0,0,100,100);
        this.paint(this.getGraphics());
  }

}
0

Spróbuj tak

class GCanvas extends Canvas
{
   
  public void paint(Graphics g)
  {
        super.paint(g);
        g.setColor(Color.BLACK);
        g.drawRect(0,0,100,100);
  }

}
0

a jesli chce dodac funkcje ktora rysuje ten prostokat a nie rysowac go za kazdym razem?

0

Co znaczy

nie rysowac go za kazdym razem

Metoda paint jest wywoływana automatycznie gdy konieczne jest odświeżenie (użytkownik zmienił wielkość okna, wyciągnął okno na wierzch,...). Ty jej nigdy nie wywołujesz. Czasami możesz wywołać metodę repaint(), np. jeżeli po 15 minutach działania programu zamiast prostokąta ma być rysowany trójkąt.

0

ok, rozumiem, jak wiec dodac funkcje ktora bedzie rysowala prostokat na canvasie?

0

????
Spójrz trzy posty wstecz. Jeżeli chcesz rysować wypełniony prostokąt, to zamień

g.drawRect(0,0,100,100);
//na
g.fillRect(0,0,100,100);
0

Masz w prezencie kompletny program

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

public class A extends JFrame
{
    public static void main(String[] args)
    {
        new A();
    }
    //------------------------
    public A()
    {
        super("Test canvasu");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout(2,2));
        add(new MyCanvas(),BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
//------------------------------------------------
class MyCanvas extends Canvas
{
    public MyCanvas()
    {
        super();
        setPreferredSize(new Dimension(400,300));
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.BLACK);
        g.fillRect(0,0,100,100);
    }
}
0

ehh.. sorry zamotalem i nie zrozumielismy sie... ;/ ale dzieki wielkie za pomoc:)

chodzi mi o cos takiego:

class MyCanvas extends  Canvas
{
    public MyCanvas()
    {
        super();
        setPreferredSize(new Dimension(400,300));
    }

    public void RysujProstokatNaCanvasie(int x, int y) 
    {
      int width=10;
      int height=10;
     //tu powinnien byc kod ktory to umozliwia
    }
    public void RysujSpiraleNaCanvasie(int x, int y)
    {       
    }

}

Da sie tak zrobic??
Nie chce Od razu podawac na sztywno paint-a.
Przykladowe uzycie: uzytkownik tworzy obiekt canvas, a potem wywoluje na nim metode rysujaca np
metode RysujProstokatNaCanvasie(10,10).

0

Rysowanie odbywa się w metodzie paint() (paintComponent()), ona może rysować różne rzeczy w zależności np. od wartości pewnej zmiennej,a wartość zmiennej zależy od działań użytkownika.
Rysuj raczej na obiekcie klasy JPanel.

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

public class A extends JFrame implements ActionListener
{
    private String stan=" ";
    //------------------------
    public static void main(String[] args)
    {
        new A();
    }
    //------------------------
    public A()
    {
        super("Różne figury");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout(2,2));
        add(new MyCanvas(this),BorderLayout.CENTER);

        JPanel panel=new JPanel();

        JButton b=new JButton("Prostokąt");
        b.addActionListener(this);
        panel.add(b);
        b=new JButton("Elipsa");
        b.addActionListener(this);
        panel.add(b);
        b=new JButton("Pustka");
        b.addActionListener(this);
        panel.add(b);

        add(panel,BorderLayout.SOUTH);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    //------------------------
    public void actionPerformed(ActionEvent ae)
    {
        String cmd=ae.getActionCommand();
        if(cmd.equals("Prostokąt"))
        {
            stan="P";
        }
        if(cmd.equals("Elipsa"))
        {
            stan="E";
        }
        if(cmd.equals("Pustka"))
        {
            stan=" ";
        }
        repaint();
    }
    //------------------------
    public String getStan()
    {
        return stan;
    }
}
//------------------------------------------------
class MyCanvas extends JPanel
{
    private A parent;
    //------------------------
    public MyCanvas(A parent)
    {
        super();
        this.parent=parent;
        setPreferredSize(new Dimension(400,300));
    }
    //------------------------
    public void paint(Graphics g)
    {
        super.paint(g);
        if(parent.getStan().equals("P"))
        {
            drawRectangle(g);
        }
        if(parent.getStan().equals("E"))
        {
            drawEllipsis(g);
        }
    }
    //------------------------
    private void drawRectangle(Graphics g)
    {
        g.setColor(Color.GREEN);
        g.fillRect(0,0,100,100);
    }
    //------------------------
    private void drawEllipsis(Graphics g)
    {
        g.setColor(Color.BLUE);
        g.fillArc(50,50,200,100,0,360);
    }
}

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