Odświeżanie obrazu

0

Chciałbym prosić o poprawienie programu.
Ma on działać tak, że po wciśnięciu przycisku na mapie, która odtwarza się po uruchomieniu, mają być rysowane izolinie.

Do konstruktora klasy przycisku podana jest jako argument referencja do instancji rozszerzenia klasy JPanel.

Oto kod:

class Button extends JButton implements ActionListener {

	private JPanel buttonPanel;
	private JPanel obrazPanel;

	Button(JPanel buttonPanel, JPanel obrazPanel) {
		super("Przycisk");
		this.buttonPanel = buttonPanel;
		this.obrazPanel = obrazPanel;
		setPreferredSize(new Dimension(100, 20));
		addActionListener(this);
		this.obrazPanel = obrazPanel;
	}

	public void actionPerformed(ActionEvent e) {
		obrazPanel.RysujLinie(obrazPanel.g2d); // tutaj g2d jest podkreślone na czerwono
	}
}

public class ObrazPanel extends JPanel {
        public Graphics2D g2d;
        ...
        public void paintComponent(Graphics g) {
		
		g2d = (Graphics2D) g;
		
		g2d.drawImage(diskImage, 0, 0, this);

	}

Nie mogę dostać się do obiektu Graphics g2d. Jak można to zrobić ?

0

Całe rysowanie powinno się odbywać w metodzie paintComponent

    public void actionPerformed(ActionEvent e) {
        obrazPanel.repaint();
    }
...
 public void paintComponent(Graphics g) {
 
        g2d = (Graphics2D) g;
 
        g2d.drawImage(diskImage, 0, 0, this);
        RysujLinie(g2d);
0

Tak poprawiony program będzie rysował linie od razu po włączeniu się, a mi chodzi o to, aby były one rysowanie po wciśnięciu przycisku.

0
boolean rysujLinie = false;
...
    public void actionPerformed(ActionEvent e) {
        rysujLinie = true;
        obrazPanel.repaint();
    }
...
 public void paintComponent(Graphics g) {
 
        g2d = (Graphics2D) g;
 
        g2d.drawImage(diskImage, 0, 0, this);
        if(rysujLinie){        
            RysujLinie(g2d);
       }
0

Oto kod:

class Button extends JButton implements ActionListener {

	private JPanel buttonPanel;
	private JPanel obrazPanel;

	Button(JPanel buttonPanel, JPanel obrazPanel) {
		super("Przycisk");
		this.buttonPanel = buttonPanel;
		this.obrazPanel = obrazPanel;
		setPreferredSize(new Dimension(100, 20));
		addActionListener(this);
		this.obrazPanel = obrazPanel;
	}

	public void actionPerformed(ActionEvent e) {
                obrazPanel.rysujLinie = true; // rysujLinie cannot be resolved or is not a field
                obrazPanel.repaint();
	}
}

public class ObrazPanel extends JPanel {
        public Graphics2D g2d;
        public boolean rysujLinie = false;
        ...
        public void paintComponent(Graphics g) {
		
		g2d = (Graphics2D) g;
		
		g2d.drawImage(diskImage, 0, 0, this);

                if(rysujLinie){        
                   RysujLinie(g2d);
                }

	}

Jak widać nie pomaga

1

Piszesz bzdurny kod, więc nic dziwnego, że nie działa. Czy w klasie JPanel jest pole rysujLinie? Dodaj rzutowanie

//zamiast
obrazPanel.rysujLinie = true;
//daj
((ObrazPanel)obrazPanel).rysujLinie = true;

albo zmień typ pola obrazPanel na ObrazPanel

0

Dziękuję

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