paint(), repaint(), rysowanie...

0

Stworzylem sobie wlasny MyPanel ktory dziedziczy po JPanel.

public class MyPanel extends JPanel {

final Counter knotIndex = new Counter(0);
final ArrayList <Knot> graph = new ArrayList<Knot>();

    public MyPanel(){

            addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e){
                if(knotIndex.isDrawKnots()){
                if(e.getClickCount()==2){
                    Knot knot = new Knot();
                    knot.setNr(knotIndex.getIndex());
                    knot.setNazwa(JOptionPane.showInputDialog("Podaj nazwe: "));
                    knot.setX(e.getX());
                    knot.setY(e.getY());
                    knot.paint(getGraphics());
                    knotIndex.increase();
                    graph.add(knot);
                }
                }
            }});
         
}

    @Override
    protected void paintComponent (Graphics g) {
        System.out.println("::rysuje Panel");
        super.paintComponent(g);
        }
    }

}

A moj kod dla klasy Knot wyglada:

public class Knot extends Canvas{

    int nr;
    String nazwa;
    int x;
    int y;

    public Knot( ){
        System.out.println("Nowy obiekt: Knot");
    }

    public String getNazwa() {
        return nazwa;
    }

    public void setNazwa(String nazwa) {
        this.nazwa = nazwa;
    }

    public int getNr() {
        return nr;
    }

    public void setNr(int nr) {
        this.nr = nr;
    }


    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }



    @Override
    public void paint(Graphics g){
        System.out.println("::Test, rysuje knot");
        super.paint(g);
        g.fillOval(this.getX(),this.getY(), 20, 20);
    }



}

Klasa Main:

public class Main {

public static void main(String[] args) {

    JFrame fram = new JFrame();
    fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MyPanel panel = new MyPanel();

    fram.add(panel);
    fram.setSize(new Dimension(500,500));
    fram.setVisible(true);
}

}

Wszystko smiga tylko ze mam dwa ale:

  1. Rysunek Knota (kolo) znika po rozciagnieciu okna albo zminimalizowaniu
  2. Wiem ze nie powinno sie wywoływać recznie metody paint(), jednak gdy robie repaint na obiekcie Knot to nic sie nie dzieje.

Szczerze mowiac troche bladze, na czuja rozszerzylem klase Knot o Canvas bo pozwala na przeladowanie paint(). Mozna to w ten sposob zalatwic ? Czego brakuje, co jest zle...
I nie wiem dokladnie jak to jest z tym przekazywaniem graphics do metody paint()...
Czuje ze ten obiekt Knot nie wie gdzie ma sie przerysowac, dobrze mysle ?
Tak jak mowie, chodzi ale wiem ze jest zle i sie wykrzacza przy manipulowaniu oknem.
Fachowe rady w jezyku dla beginnera mile widziane :)
Dzieki!

0

Nie lubię tego całego malowania w Java, ale Ty może zacznij oldschoolowo;) od tutoriala Sun-a.

http://java.sun.com/docs/books/tutorial/uiswing/painting/index.html

Acha, w znikaniu rysunku, dodaj moze jakis windowlistener i wtedy przy każdej zmianie wielkości okna wywołuj metodę repaint(), powinno pomóc.

0

W klasie Knot nie przeciążaj metody paint, a paintComponent.

Wszystko powinno działać bez ręcznego wywoływania paint i repaint.

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