Programa não está dando break

Estou com um problema no meu codigo, o qual quando estou tentando encerrar o codigo com a opção 3, para mostrar meus sensores no JFrame e encerrar o aplicativo. Quando coloco 3 ele mostra todos os sensores mas não encerra.
Será que alguem poderia me ajudar?

package Exercicio1;

import java.awt.Graphics;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Exercicio1 extends JFrame {
private static final long serialVersionUID = 1L;
static VectorListaSensores = new Vector();

public static void main(String[] args) {
	new Exercicio1();
}

public Exercicio1() {
	setSize(800,400);
	setLocationRelativeTo(null);
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setVisible(true);
}

public void paint(Graphics g) {
	int op = 0,cont = 0;
	
	while (op!=3 || cont<20) {
		op = Integer.parseInt(JOptionPane.showInputDialog("1-Inserir um nó do tipo Telos\n2-Inserir um nó do tipo Mica\n3-Exibir a rede e sair"));
		
		switch (op) {
		case 1: {
			cadastraTelos();
			cont++;
			break;
		}
		case 2: {
			cadastraMica();
			cont++;
			break;
		}
		case 3: {
			for (int i = 0; i < ListaSensores.size(); i++) {
				g.drawOval(ListaSensores.get(i).getX(),ListaSensores.get(i).getY(), 50, 50);
				g.drawString(ListaSensores.get(i).getId(), ListaSensores.get(i).getX(),ListaSensores.get(i).getY());
			}
			break;
		}
		}
	}
}

public static void cadastraTelos() {
	Telos entrada = new Telos(0, 0, null, 0);
	entrada.setId(JOptionPane.showInputDialog("Digite o nome do sensor")); 
	entrada.setX(Integer.parseInt(JOptionPane.showInputDialog("Digite o ponto X do sensor")));
	entrada.setY(Integer.parseInt(JOptionPane.showInputDialog("Digite o ponto Y do sensor")));
	entrada.setTempsensor(Integer.parseInt(JOptionPane.showInputDialog("Digite o tempo do sensor")));
	ListaSensores.add(entrada);
}

public static void cadastraMica() {
	Mica entrada = new Mica(0, 0, null, 0);
	entrada.setId(JOptionPane.showInputDialog("Digite o nome do sensor")); 
	entrada.setX(Integer.parseInt(JOptionPane.showInputDialog("Digite o ponto X do sensor")));
	entrada.setY(Integer.parseInt(JOptionPane.showInputDialog("Digite o ponto Y do sensor")));
	entrada.setRuidosensor(Integer.parseInt(JOptionPane.showInputDialog("Digite o ruido do sensor")));
	ListaSensores.add(entrada);
}

}

Classe NoSensor

package Exercicio1;

public class NoSensor {
private int x;
private int y;
private String id;

public NoSensor(int x, int y, String id) {
	super();
	this.x = x;
	this.y = y;
	this.id = id;
}

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;
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}

}

Classe Telos

package Exercicio1;

public class Telos extends NoSensor{
private int tempsensor;

public Telos(int x, int y, String id, int tempsensor) {
	super(x, y, id);
	this.tempsensor = tempsensor;
}
public int getTempsensor() {
	return tempsensor;
}
public void setTempsensor(int tempsensor) {
	this.tempsensor = tempsensor;
}

}

Classe Mica

package Exercicio1;

public class Mica extends NoSensor {
private int ruidosensor;

public Mica(int x, int y, String id, int ruidosensor) {
	super(x, y, id);
	this.ruidosensor = ruidosensor;
}

public int getRuidosensor() {
	return ruidosensor;
}
public void setRuidosensor(int ruidosensor) {
	this.ruidosensor = ruidosensor;
}

}

O for(int i=0; i<objeto.size(); i++){}

boolean res= false
while(res){
        if(a.equals(a)){
          resp = true;
}
}

O for é utilizado quando quando você sabe o tamanho do vetor!
O while é utilizado quando você não sabe o tamanho do list, ou não sabe quando vai parar
É um erro usar o break dentro de um while()

É que o seu break interrompe o switch, mas seu switch está dentro de um while.

O seu while vai repetir enquanto op != 3 OU cont < 20.
Se não interrompeu ao digitar 3 então é sinal que op < 20.

Se você quer interromper o while quando cair no case 3 do seu switch, coloque um label no seu while, dessa forma:

public void paint(Graphics g) {
    int op = 0,cont = 0;

    LOOP_PRINCIPAL: while (op!=3 || cont<20) {
        op = Integer.parseInt(JOptionPane.showInputDialog("1-Inserir um nó do tipo Telos\n2-Inserir um nó do tipo Mica\n3-Exibir a rede e sair"));

        switch (op) {
            case 1:
                cadastraTelos();
                cont++;
                break;
            case 2:
                cadastraMica();
                cont++;
                break;
            case 3:
                for (int i = 0; i < ListaSensores.size(); i++) {
                    g.drawOval(ListaSensores.get(i).getX(),ListaSensores.get(i).getY(), 50, 50);
                    g.drawString(ListaSensores.get(i).getId(), ListaSensores.get(i).getX(),ListaSensores.get(i).getY());
                }
                break LOOP_PRINCIPAL; // manda encerrar o while
        }
    }
}

Se não quiser usar um label, você pode substituir o break LOOP_PRINCIPAL por return, para encerrar a execução do método.

Dica:
Utilize variáveis locais para não desperdiçar chamas de método.
Ao invés de chamar ListaSensores.get(i) 5 vezes, utilize uma variável local, o mesmo serve para o getX() e getY(), veja:

NoSensor sensor = ListaSensores.get(i);
int x = sensor.getX();
int y = sensor.getY();
g.drawOval(x, y, 50, 50);
g.drawString(sensor.getId(), x, y);

Não é erro usar break dentro de while.
Você pode usar o break para interromper o while, switch, for e do além de poder usar o break para interromper uma estrutura de repetição ou seleção especificada com um label, utilizando break NOME_DO_LABEL.
A mesma regra do break também é válida para a instrução continue.

1 curtida

Muito obrigado staroski, ajudou muito!!

1 curtida