Ir ao conteúdo
  • Cadastre-se

Joanderson Pereira

Membro Pleno
  • Posts

    47
  • Cadastrado em

  • Última visita

Tudo que Joanderson Pereira postou

  1. Estou utilizando o NavigatorLayout que permite criar um menu lateral retrátil semelhante ao utilizado na PlayStore/Twitter. Os métodos dessa classe estão funcionais e consigo utilizar o navigationItemSelected normalmente. O projeto é uma rede social, quando o usuário estiver no Feed o menu lateral exibirá a opção "Perfil" que guiará o usuário para o seu Perfil, quando o usuário estiver no Perfil o mesmo botão que ele clicou anteriormente agora se chama "Feed" e o redireciona de volta para o Feed da aplicação. Essa função é um onClickListener relacionado ao menu lateral. private NavigationView.OnNavigationItemSelectedListener navigationItemSelected = new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch(menuItem.getItemId()){ case R.id.nav_home: if(altNumber == 0){ menuItem.setTitle("Perfil"); altNumber = 1; changePage(getSupportFragmentManager(), new FeedFragment()); // Log.d("CurrentFragment", getCurrentFragment(getSupportFragmentManager()).toString()); } else{ menuItem.setTitle("Feed"); altNumber = 0; changePage(getSupportFragmentManager(), new ProfileFragment(UserController.getInstance().getAuth().getCurrentUser().getUid())); // Log.d("CurrentFragment", getCurrentFragment(getSupportFragmentManager()).toString()); } break; case R.id.nav_logout: UserController.getInstance().getAuth().signOut(); Intent a = new Intent(getApplicationContext(), FirstActivity.class); startActivity(a); finish(); break; case R.id.nav_tools: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_gallery: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_slideshow: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_send: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_share: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; default: throw new IllegalStateException("Unexpected value: " + menuItem.getItemId()); } return true; } No Feed os posts informam o usuário responsável pela publicação, é possível clicar no nome desse usuário e ser redirecionado para o Perfil correspondente. Agora aqui mora o problema, eu quero que o botão do Menu "Perfil" altere o nome para "Feed" nesse onClick também. Porém o menuItem só é visível em MainActivity, a View só enxerga o que ela abrange, até onde sei não é possível pois a viewPost não abrange o botão do menu, são estruturas separadas. Se tento utilizar o findViewByid para encontrar o botão do menu dentro de Post recebo uma null reference. Também tentei criar um método estático dentro da MainActivity porém não é possível instanciar view dentro dela, pois não é possível criar views estáticas. Talvez a única solução seja passar a view como parâmetro, mas isso volta para a tentativa anterior. Como referenciar o menuItem fora da classe principal? Parte da Classe do Post public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> implements ManageData { private final List<Post> mValues; private final OnListFragmentInteractionListener mListener; private final Context ctx; public PostAdapter(Context ctx, List<Post> items, OnListFragmentInteractionListener listener) { mValues = items; mListener = listener; this.ctx = ctx; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.fragment_post_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final PostAdapter.ViewHolder holder, final int position) { UserController.getInstance().getUserData(this, mValues.get(position).getUid(), "nome de usuário", holder.nome de usuário); if (!mValues.get(position).getPublisher_Id().equals(mValues.get(position).getUid())){ UserController.getInstance().getUserData(this, mValues.get(position).getPublisher_Id(), "nome de usuário", holder.publisherName); //pegar nome do publisher holder.publisherName.setText(holder.publisherName.getText().toString() + " " + mValues.get(position).getPublisher_description()); } UserController.getInstance().getUserData(this, mValues.get(position).getUid(), "image", holder.post_image_profile); holder.description.setText(mValues.get(position).getDescription()); holder.likes.setText(mValues.get(position).getLikes()); holder.n_comments.setText(mValues.get(position).getnComments()); LikeController.getInstance().checkLike(mValues.get(position), holder.btn_like); holder.btn_like.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (holder.btn_like.getTag().equals("Like")){ LikeController.getInstance().setLike(mValues.get(position), holder.likes, false); holder.btn_like.setImageResource(R.drawable.ic_feed_like2); holder.btn_like.setTag("Liked"); } else{ LikeController.getInstance().setLike(mValues.get(position), holder.likes, true); holder.btn_like.setImageResource(R.drawable.ic_feed_like1); holder.btn_like.setTag("Like"); } } }); //O clickListener que redireciona para o perfil do publisher do Post holder.nome de usuário.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String post_Uid = mValues.get(position).getUid(); String current_User = UserController.getInstance().getAuth().getCurrentUser().getUid(); ProfileFragment pf = new ProfileFragment(post_Uid); FragmentManager fm = ((AppCompatActivity)ctx).getSupportFragmentManager(); PageController.changePage(fm, pf); PageController.switchName();//tentativa falha de usar um método estático if(current_User.equals(post_Uid)){ } Log.d("TAG", "Clicou no botão"); } }); if (mValues.get(position).getPostImage() != null){ FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReference(); StorageReference imagesRef = storageRef.child("Posts"); Glide.with(ctx) .load(mValues.get(position).getPostImage()) .into(holder.postImage); } else{ Log.d("Deu ruim", "Não carregou"); } holder.mView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { if(mListener != null){ mListener.onListFragmentInteraction(holder.mItem); } } }); } Classe principal que gerencia o menu public class PageController extends AppCompatActivity implements ManageData { private AppBarConfiguration mAppBarConfiguration; private static int altNumber = 1; private NavigationView navView = (NavigationView) findViewById(R.id.nav_view); public View mView = findViewById(R.id.nav_home); private View getView(){ return navView; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { changePage(getSupportFragmentManager(), new newPostFragment()); } }); DrawerLayout drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_tools, R.id.nav_share, R.id.nav_send) .setDrawerLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); NavigationUI.setupWithNavController(navigationView, navController); navView.setNavigationItemSelectedListener(navigationItemSelected); getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new FeedFragment()).commit(); Log.d("Fragments", getSupportFragmentManager().getFragments().toString()); //PageController.getInstance().changePage(getSupportFragmentManager(), new FeedFragment()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); TextView username = findViewById(R.id.header_username); TextView email = findViewById(R.id.header_email); ImageView profile = findViewById(R.id.header_profile); UserController.getInstance().getUserData(this, UserController.getInstance().getAuth().getCurrentUser().getUid(),"username", username); UserController.getInstance().getUserData(this, UserController.getInstance().getAuth().getCurrentUser().getUid(),"email", email); UserController.getInstance().getUserData(this, UserController.getInstance().getAuth().getCurrentUser().getUid(),"image", profile); return true; } @Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp(); } @Override public void manageData(Object data, Object view) { if (view instanceof ImageView){ Glide.with(this.getBaseContext()) .load(data) .into((ImageView)view); //holder.postImage.setContentDescription("Teste"); if(data != null) Log.d("change imageView", "PageController " + data.toString()); else Log.d("change imageView", "PageController null"); } else if ( view instanceof TextView){ ((TextView) view).setText((String) data); Log.d("change TextView", "PageController " + (String) data); } else{ Log.d("failed change", "PageController " + view + " cannot be found"); } } public static void changePage(FragmentManager fm, Fragment selectedFragment){ for (Fragment frag : fm.getFragments()){ if (frag != null){ if(frag.isVisible()) { FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(frag.getId(), selectedFragment); fragmentTransaction.commit(); } } } } public static Fragment getCurrentFragment(FragmentManager fm){ for (Fragment frag : fm.getFragments()){ if (frag != null){ if(frag.isVisible()) { return frag; } } } return null; } private NavigationView.OnNavigationItemSelectedListener navigationItemSelected = new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch(menuItem.getItemId()){ case R.id.nav_home: if(altNumber == 0){ menuItem.setTitle("Perfil"); altNumber = 1; changePage(getSupportFragmentManager(), new FeedFragment()); // Log.d("CurrentFragment", getCurrentFragment(getSupportFragmentManager()).toString()); } else{ menuItem.setTitle("Feed"); altNumber = 0; changePage(getSupportFragmentManager(), new ProfileFragment(UserController.getInstance().getAuth().getCurrentUser().getUid())); // Log.d("CurrentFragment", getCurrentFragment(getSupportFragmentManager()).toString()); } break; case R.id.nav_logout: UserController.getInstance().getAuth().signOut(); Intent a = new Intent(getApplicationContext(), FirstActivity.class); startActivity(a); finish(); break; case R.id.nav_tools: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_gallery: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_slideshow: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_send: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; case R.id.nav_share: Toast.makeText(getApplicationContext(), "Função não implementada", Toast.LENGTH_LONG).show(); break; default: throw new IllegalStateException("Unexpected value: " + menuItem.getItemId()); } return true; } };}
  2. Temos que lembrar que String é uma coleção de caracteres análoga a ao `Array``: Como acontece com os Arrays o índice do primeiro caractere é o 0(zero). O índice do último caractere, caso haja caracteres, é o comprimento do String menos 1(um). Isso pois o índice do primeiro caractere é 0, segundo é 1, do terceiro é 2,..., o índice do enésimoelemento(N) é igual a posição ordinal do enésimo elemento menos um, o que no seu exemplo pode ser traduzido com novaString.length() - 1 De posse da informação de que o índice do último elemento duma String é length() - 1 para remover o último elemento duma Java String dentro do método substring é apenas retirar mais um elemento do comprimento da String: novaString.length() - 2 Então o case 63 pode ser reescrito da seguinte forma case 63 : // Verifica o comprimento da string para evitar o erro Index out of range(índice fora da faixa) novaString = (novaString.length() >= 2) ? // Caso comprimento seja maior ou igual a dois retorna o substring sem o último elemento. novaString.substring(0, novaString.length() - 2) : //Caso o comprimento seja menor que dois retorna um string vazio. ""; return "] "; Porém esse é apenas um erro no código, se o case 63 fosse chamado esse erro ocorreria, mas não é o que está acontecendo. Percebi que na lógica que usei o programa não está conseguindo formatar o texto adequadamente para os procurar os termos no hashmap, aparentemente apenas os case 62 e 63 não estão sendo chamados. Vou ter que rever a lógica do código para corrigir o problema.
  3. O problema era um typo. O React possui um método chamado componentDidMount que é acessível para componentes escritos em formato de classe. Ele é invocado imediatamente após um componente ser montado (inserido na árvore). Inicializações que exijam nós do DOM devem vir aqui. Se precisar carregar data de um endpoint remoto, este é um bom lugar para instanciar sua requisição. Percebi que componetDidMount (conforme digitei) é um componente inexistente do react, ou seja, ele não estava realizando nada. Não havia um erro sintaxe, eu criei um método que não fazia nada, não era uma referência ao método do React. O console.log(response.data) não exibia nenhuma informação. O correto é componentDidMount, agora a página exibe as informações que eu quero diretamente do MongoDB, e no console.log aparece o array nos conformes. async componentDidMount() { const response = await api.get('posts'); this.setState({ feed: response.data }); console.log(response.data); } O problema era apenas um typo que não me permitia usar o recurso do React. Sou iniciante em programação web e não sabia como depurar o código, algo realmente simples. No console: Array(8) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ].
  4. Estou seguindo um tutorial de como fazer um instagram, já foi feito e testado o backend e o frontend separadamente. No backend consigo alterar as rotas e enviar/salvar informações para o MongoDb, no frontend consigo exibir as informações da maneira que quero. O problema está quando eu vou puxar do banco de dados, fiz um esquema para que ele percorra todos os posts do database exibindo suas informações, só que aparentemente ele não está percorrendo nenhuma posição. Não creio que o problema seja o mongodb pois consigo conectar e upar arquivos (mas não pegá-los?). Estou certo que o código está como no vídeo. import React, {Component} from 'react'; import api from '../services/api'; import './Feed.css'; import more from '../assets/more.png'; import tolike from '../assets/tolike.png'; import nolike from '../assets/nolike.png'; import comment from '../assets/comment.png'; import send from '../assets/send.png'; class Feed extends Component{ state = { feed: [], }; async componetDidMount() { const response = await api.get('posts'); this.setState({ feed: response.data }); } render() { return( <section id="post-list"> { this.state.feed.map(post => ( <article> <header> <div className="user-info"> <span>{post.author}</span> <span className="place"> {post.place}</span> </div> <img src={more} alt= "Mais"/> </header> <img src= {`http://localhost:3333/files/${post.image}`} alt= "post"/> <footer> <div className= "actions"> <img src = {nolike} alt=""/> <img src = {comment} alt=""/> <img src = {send} alt=""/> </div> <strong>{post.likes}</strong> <p> {post.description} <span> {post.hashtag}</span> </p> </footer> </article> ))} </section > ); } } export default Feed; Deixarei o projeto como anexo, tenho certeza que para quem entende é algo fácil de resolver. Meus estudos com programação web estão travados por causa disso backend.rar frontend.rar
  5. Existe um excesso de "ifs" no seu código, bastaria isso: //pedra == 0 papel == 1 tesoura == 2 if (usuario < computador || (usuario == 2 && computador == 0)){ //se o computador tiver mais pontos ele vence System.out.println("O Computador é o vencedor." + "\n");//se o computador jogou pedra e o usuario tesoura ele vence compv += 1; } else if (usuario > computador || (computador == 0 && usuario == 2)){ //se o usuário tiver mais pontos ele vence System.out.println("Parabéns! Você venceu!" + "\n")//se o usuário jogou pedra e o computador tesoura ele vence userv += 1; } else {//Se nenhuma das situações acima funcionou, significa que foi empate System.out.println("Empate" + "\n"); empt += 1; } O else if só vai rodar caso o if acima seja falso. Se o computador não tem mais pontos que o usuário (e nem jogou pedra e o usuario tesoura) o java irá ler o else if, caso contrário ele irá ignorar as novas verificações (pois são desnecessária pois o usuário já venceu.). No seu código o computador está checando todas as possibilidades mesmo que ele já tenha verificado que o usuário ganhou (por exemplo). Pelo fato de você está usando try/catch quando um erro ocorre o programa ao invés de fechar irá pular do bloco try para o bloco catch Quando você digita uma letra nessa parte o código pula direto para o catch, ou seja, tudo depois dessa linha não é rodado. Você definiu opc=0 e só altera ela depois do switch. Caso você digite uma letra o código é rodado apenas uma vez, se você digita um número inválido o opc continua igual a 0. Aqui é onde o loop é definido, se o usuário digitar qualquer coisa que não seja 1 o código não entra em loop. Se esse trecho não for lido o programa não prossegue (pois opc continuará como 0). Caso o usuário digite 1 na primeira vez, o código entrará em loop com opc = 1, na segunda vez que ele chega nessa linha se o usuário digitar uma letra um novo valor não será atribuído para opc, ou seja, opc continua igual a 1 e código repete. Se o usuário digitar um número inteiro (que não seja 1), esse valor é atribuído para opc, que deixa de ser 1 e o código não entra em loop. Para corrigir isso você precisa iniciar a variavel opc dentro do DOWHILE, assim toda vez que o código repetir essa variável será redefinida do{ int opc = 0; //resto do código }while(opc == 1);
  6. Criei um programa para traduzir notas musicais de um site para um formato mais legível, ele recebe e analisa cada dois dígitos de uma string procurando por eles (como chave) dentro de um hashmap<String,Integer>, caso encontre, o int que ele retorna é usado em um switch que encontrará os caracteres correspondentes que serão gravados em uma nova string. A novaString é uma variável de classe, ela é usada no método public traduzir para concatenar os caracteres traduzidos e é usada no método private traduzir quando o switch case 63 é chamado, nesse método private eu tento deletar o último caractere da novaString com substring, porém parece que estou editando uma cópia e não a variável em si porque nenhuma alteração feita nessa linha é salva. public class main { public static void main(String[] args) { Resources r1 = new Resources(); String texto = "[t8] ttt [r5] t r [r4] t y [u5] y\r\n" + "[t8] ttt [r5] t t [w4] 5\r\n" + "[t8] ttt [r5] t r [r4] t y [u5] y\r\n" + "[t8] ttt [r5] t y [w4] [w5]\r\n" + "[t8] t [y5] w [o4] i u [y5]\r\n" + "u i [u8] y t [r5] t r [e4] [w5]\r\n" + "[t8] t [y5] w [o4] i u [y5]\r\n" + "u i [u8] y t [r5] t r [r4] t y [u5] y [t8]"; r1.c1.gravar("Titanic", r1.traduzir(texto)); } } import java.util.HashMap; import java.util.Map; public class Resources { Map<String,Integer> example = new HashMap<String,Integer>(); public Conectar c1 = new Conectar(); private String novaString = ""; public Resources() { // TODO Auto-generated constructor stub bancoDados(); } private void bancoDados() { example.put("1", 1); // dó example.put("1|", 2); // dó sustenido example.put("2", 3); // ré example.put("2|", 4); // ré sustenido example.put("3", 5); // mi example.put("4", 6); // fá example.put("4|", 7); // fá sustenido example.put("5", 8); // sol example.put("5|", 9); // sol sustenido example.put("6", 10); // lá example.put("6|", 11); // lá sustenido example.put("7", 12); // si example.put("8", 13); // dó example.put("8|", 14); // dó sustenido example.put("9", 15); // ré example.put("9|", 16); // ré sustenido example.put("0", 17); // mi example.put("q", 18); // fá example.put("Q", 19); // fá sustenido example.put("w", 20); // sol example.put("W", 21); // sol sustenido example.put("e", 22); // lá example.put("E", 23); // lá sustenido example.put("r", 24); // si example.put("t", 25); // dó example.put("T", 26); // dó sustenido example.put("y", 27); // ré example.put("Y", 28); // ré sustenido example.put("u", 29); // mi example.put("i", 30); // fá example.put("I", 31); // fá sustenido example.put("o", 32); // sol example.put("O", 33); // sol sustenido example.put("p", 34); // lá example.put("P", 35); // lá sustenido example.put("a", 36); // si example.put("s", 37); // dó example.put("S", 38); // dó sustenido example.put("d", 39); // ré example.put("D", 40); // ré sustenido example.put("f", 41); // mi example.put("g", 42); // fá example.put("G", 43); // fá sustenido example.put("h", 44); // sol example.put("H", 45); // sol sustenido example.put("j", 46); // lá example.put("J", 47); // lá sustenido example.put("k", 48); // si example.put("l", 49); // dó example.put("L", 50); // dó sustenido example.put("z", 51); // ré example.put("Z", 52); // ré sustenido example.put("x", 53); // mi example.put("c", 54); // fá example.put("C", 55); // fá sustenido example.put("v", 56); // sol example.put("V", 57); // sol sustenido example.put("b", 58); // lá example.put("B", 59); // lá sustenido example.put("n", 60); // si example.put("m", 61); // dó example.put("[", 62); example.put("]", 63); } public String traduzir(String tr) { for (int i = 0; i < tr.length(); i++) { String str; if(tr.length() >= i + 1) { str = tr.substring(0 + i, 1 + i); if (example.get(str) == null) { if (tr.length() >= i + 2) { str = tr.substring(0 + i, 1 + i); if (example.get(str) == null) { } else novaString += traduzir(example.get(str)); } } else { novaString += traduzir(example.get(str)); } } } return novaString; } private String traduzir(int i) { switch (i) { case 1 : return "1C "; // dó case 2 : return "1C# "; // dó sustenido case 3 : return "1D "; // ré case 4 : return "1D# "; // ré sustenido case 5 : return "1E "; // mi case 6 : return "1F "; // fá case 7 : return "1F# "; // fá sustenido case 8 : return "1G "; // sol case 9 : return "1G# "; // sol sustenido case 10 : return "1A "; // lá case 11 : return "1A# "; // lá sustenido case 12 : return "1B "; // si case 13 : return "2C "; // dó case 14 : return "2C# "; // dó sustenido case 15 : return "2D "; // ré case 16 : return "2D# "; // ré sustenido case 17 : return "2E "; // mi case 18 : return "2F "; // fá case 19 : return "2F# "; // fá sustenido case 20 : return "2G "; // sol case 21 : return "2G# "; // sol sustenido case 22 : return "2A "; // lá case 23 : return "2A# "; // lá sustenido case 24 : return "2B "; // si case 25 : return "3C "; // dó case 26 : return "3C# "; // dó sustenido case 27 : return "3D "; // ré case 28 : return "3D# "; // ré sustenido case 29 : return "3E "; // mi case 30 : return "3F "; // fá case 31 : return "3F# "; // fá sustenido case 32 : return "3G "; // sol case 33 : return "3G# "; // sol sustenido case 34 : return "3A "; // lá case 35 : return "3A# "; // lá sustenido case 36 : return "3B "; // si case 37 : return "4C "; // dó case 38 : return "4C# "; // dó sustenido case 39 : return "4D "; // ré case 40 : return "4D# "; // ré sustenido case 41 : return "4E "; // mi case 42 : return "4F "; // fá case 43 : return "4F# "; // fá sustenido case 44 : return "4G "; // sol case 45 : return "4G# "; // sol sustenido case 46 : return "4A "; // lá case 47 : return "4A# "; // lá sustenido case 48 : return "4B "; // si case 49 : return "5C "; // dó case 50 : return "5C# "; // dó sustenido case 51 : return "5D "; // ré case 52 : return "5D# "; // ré sustenido case 53 : return "5E "; // mi case 54 : return "5F "; // fá case 55 : return "5F# "; // fá sustenido case 56 : return "5G "; // sol case 57 : return "5G# "; // sol sustenido case 58 : return "5A "; // lá case 59 : return "5A# "; // lá sustenido case 60 : return "5B "; // si case 61 : return "6C "; // dó case 62 : return "["; case 63 : novaString = novaString.substring(0, novaString.length() - 1); return "] "; default: return ""; } } } Tudo que quero é quando o case 63 for chamado o caractere da última posição da novaString seja deletado.
  7. Estou tentando criar uma calculadora no java igual aquela que vem junto com o Windows (pelo menos suas funções básicas), No textField eu quero: Que seja possível adicionar Texto tanto pelos botões na tela como pelo teclado; Que ele aceite apenas números, um ponto/vírgula. Vi em um vídeo no youtube que a solução é sobreescrever a classe plainDocument. import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class TeclasPermitidas extends PlainDocument { public TeclasPermitidas() { // TODO Auto-generated constructor stub } @Override public void insertString(int offset, String str, javax.swing.text.AttributeSet attr) throws BadLocationException{ super.insertString(offset, str.replaceAll("[^0-9]", ""), attr); } public void replace(int offset, String str, javax.swing.text.AttributeSet attr) throws BadLocationException{ super.insertString(offset, str.replaceAll("[^0-9]", ""), attr); } } Pelo que eu vi o código é para essa classe que o compilador vai olhar para quando for realizar alterações no texto do textField. textField.setDocument(new TeclasPermitidas()); O máximo que consegui foi permitir pontos, porém um número indefinido de pontos, eu não consegui limitar para que apenas um ponto seja digitado. Aparentemente os quantificadores da regex servem apenas para validação, eles não limitam a string. super.insertString(offset, str.replaceAll("[^0-9 |^.]", ""), attr); Enfim se alguém souber como resolver essa expressão numérica ou como deixar o textField da maneira que eu quero de outra forma (pelo javafx sei lá) sou todo ouvidos
  8. Resolvi, o problema todo estava nessa linha do código: new View().setVisible(true); Eu estava chamando o showImputDialog dentro do construtor da classe View, eu pensava que o ato de criar e colocar informações no JFrame o tornava visível. Só que não era bem assim que estava acontecendo. Em View( ) { de new View.setVisible(true);} o construtor da classe é chamado, o compilador "para" apenas para executar as linhas do construtor de View, ou seja, o compilador ainda não chegou em .setVisible(true); O comando que exibe a janela na tela é setVisible(true), o que o meu showImputDialog estava fazendo era decidir se as informações da janela seriam carregadas ou não, quando usuário terminava de interagir com o showImputDialog independentemente das informações da janela serem carregadas o compilador continuava a ler a linha {new View.setVisible(true);}. E exibia o que estivesse no JFrame Ou seja com as informações carregadas ou não, o JFrame era exibido quando chegava em .setVisible(true); Então eu coloquei o setVisible(true) dentro do construtor da classe View (mas especificamente,dentro do if do showImputDialog), agora a janela só é exibida caso os dois nomes sejam informados, caso contrário o programa retorna para Menu. //Classe Menu btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { regra1 = true; new View(); } }); btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setBounds(246, 83, 104, 23); contentPane.add(btnNewButton); btnMelhorDe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { regra1 = false; new View(); } }); //Construtor da Classe View String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ1 != null) { String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ2 != null) { j1.setNome(nomeJ1); j2.setNome(nomeJ2); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); setVisible(true); Menu.btnNewButton.setEnabled(false); Menu.btnMelhorDe.setEnabled(false); P.S: Meus jogadores estão private novamente adicionado 25 minutos depois No meu estava errado, só retornava 0, por isso que o jogador um sempre jogava primeiro, eu pensava que era apenas sorte O código é gerado pelo WindowBuilder, então sim, como eu executava apenas a classe principal (Menu) que chamava as outras não estava dando problemas, não sei se um pontoJar iria dar problema. (Obs agora só tem um método main no código) Ok, alterei aqui. Não é correto deixar o compilador lidar com as exceções, como programadores é ideal que tratemos elas (Pelo que entendi). Null refere-se a uma posição vazia na memória, é comum que métodos retornem null, mas apenas em métodos que procuram algo. Correto: Um método pegarLivroNaPosicao(int posicao), se não tiver um livro naquela posição quer dizer que ela está vazia, o método retorna null e podemos tratar essa exceção, por exemplo, com uma mensagem para o usuário avisando que não tem livro naquela posição. Errado: Um método comprarLivro(Livro livro), vejamos, o livro está aí, se esse método depender de um saldo para que a compra seja efetuada, o retorno deve ser um true ou false, ou ainda uma mensagem para o usuário. retornar null é uma má prática de programação. No meu código (maneira 1) eu estava forçando um erro para fechar a janela indesejada, isso também é uma má prática de programação. frame.setVisible(false); while (true) { jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE); if (jogador1 == null) { frame.setVisible(true); break; } jogador2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE); if (jogador2 == null) { frame.setVisible(true); break; } } Percebi que tanto você como Adriano colocaram esse if (que se verdadeiro, encerra o programa) "no meio do código", tenho o hábito de fazer o contrário. A minha maneira é uma prática ruim, ou algo do tipo? if (jogador != null) { ...continua o código com as funções que quero executar . . . . . } else { fecha o programa ou exibe o erro } Devo parar de ver Java Swing?
  9. Com System.exit(0) ele encerra toda a aplicação, quero fechar apenas a janela View (impedir que ela seja exibida) e voltar para Menu. Acredito ter resolvido o problema: Maneira 1 - O View é instanciado no momento que o usuário clica em um dos dois botões, parte das informações do JFrame estavam sendo carregadas antes do showImputDialog ser exibido (estavam fora do if que verificava o nome do usuário), coloquei elas dentro do if, mas acho verdadeiro problema estava no new View().setVisible(true) dentro da classe Menu, que configura a janela como visivel. Criei um objeto View (chamado frame) não instanciado dentro da classe View, quando o usuário clica em cancelar (no showImputDialog) o programa vai tentar um frame.dispose(); Como frame não está instanciado o programa gera um NullPointerException e encerra a aplicação relacionada com a classe View. Voltando para Menu (que continua aberto). Maneira 2 - Eu achei que essa maneira não é a correta para resolver o problema, então eu recortei os showImputDialog do construtor da classe View para os Jbuttons da classe Menu, tornei os dois jogadores de View public e realizei a verificação dentro desses Jbuttons, se o usuário clica em cancelar View.setVisible(true) não é rodado. O problema é que o Java carrega toda a janela sem necessidade e meus jogadores agora são public :( Quero perguntar agora se a primeira maneira de resolver esse problema é mesmo errada. Segue o código da maneira 2, não quero meus jogadores public ;-; public class View extends JFrame { private JPanel contentPane; private int rodadas = 0; private int objetivo = 18; private Dado dado = new Dado(); int vez = new Random().nextInt(1); Jogador j1 = new Jogador(); Jogador j2 = new Jogador(); import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.ImageIcon; import javax.swing.UIManager; import java.awt.Font; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Toolkit; import java.awt.Color; public class Menu extends JFrame { private JPanel contentPane; static boolean regra1 = true; static JButton btnNewButton = new JButton("18 pontos"); static JButton btnMelhorDe = new JButton("Melhor de 3"); View view; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Menu frame = new Menu(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Menu() { setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png"))); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground")); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel lblNewLabel = new JLabel("Dados Arcade"); lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow")); lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18)); lblNewLabel.setBounds(236, 39, 138, 33); contentPane.add(lblNewLabel); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { regra1 = true; view = new View(); String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ1 != null) { view.j1.setNome(nomeJ1); String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ2 != null) { view.j2.setNome(nomeJ2); btnNewButton.setEnabled(true); btnMelhorDe.setEnabled(true); view.setVisible(true); } else { btnNewButton.setEnabled(true); btnMelhorDe.setEnabled(true); } } else { btnNewButton.setEnabled(true); btnMelhorDe.setEnabled(true); } } }); btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setBounds(246, 83, 104, 23); contentPane.add(btnNewButton); btnMelhorDe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { regra1 = false; view = new View(); String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ1 != null) { view.j1.setNome(nomeJ1); String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE); if (nomeJ2 != null) { view.j2.setNome(nomeJ2); view.setVisible(true); } else { btnNewButton.setEnabled(true); btnMelhorDe.setEnabled(true); } } else { btnNewButton.setEnabled(true); btnMelhorDe.setEnabled(true); } } }); btnMelhorDe.setForeground(Color.BLACK); btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground")); btnMelhorDe.setBounds(246, 124, 104, 23); contentPane.add(btnMelhorDe); JLabel label = new JLabel(""); label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg"))); label.setBounds(10, 0, 277, 192); contentPane.add(label); JLabel label_1 = new JLabel(""); label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png"))); label_1.setBounds(0, 0, 434, 261); contentPane.add(label_1); } }
  10. Criei um jogo, a caráter de estudo, de lançar dados para dois jogadores onde um número aleatório(1-6) é gerado representando o dado e dependendo do número que sair pontos são adicionados para o jogador que efetuou a jogada. No Menu (JFrame) é possível selecionar dois modos (melhor de 3 e 18 pontos), escolhendo qualquer um dos dois criará um novo View(JFrame onde é exibido o jogo), no inicio do construtor de View coloquei dois showImputDialog que pedem que seja digitado o nome do Jogador 1 e em seguida do Jogador 2. Eu quero que durante esse showImputDialog caso o usuário clique em cancelar o JFrame de View não seja exibido na tela e retorne para o JFrame do Menu. Tentei realizar uma lógica para que isso acontecesse porém quando o usuário clica em cancelar, o JFrame de View é aparentemente fechado porém ao voltar para o ActionListener(JButton do Menu) o View é novamente aberto com todas as informações descarregadas. Não sei o que está acontecendo, segue aí o código (parcialmente gerado pelo WindowBuilder do Eclipse) import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.ImageIcon; import javax.swing.JButton; import java.awt.event.ActionListener; import java.util.Random; import java.awt.event.ActionEvent; import java.awt.Font; import java.awt.Toolkit; import java.awt.Color; public class View extends JFrame { private JPanel contentPane; private int rodadas = 0; private int objetivo = 18; private Dado dado = new Dado(); int vez = new Random().nextInt(1); private Jogador j1 = new Jogador(); private Jogador j2 = new Jogador(); /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { View frame = new View(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public View() { setIconImage(Toolkit.getDefaultToolkit().getImage(View.class.getResource("/imagem/view/icons8-dado-24.png"))); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBackground(Color.WHITE); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); Menu.btnNewButton.setEnabled(false); Menu.btnMelhorDe.setEnabled(false); String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE); if(nomeJ1 != null) { j1.setNome(nomeJ1); String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE); if(nomeJ2 != null) { j2.setNome(nomeJ2); JLabel lblNewLabel = new JLabel(""); lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (8).jpg"))); ; lblNewLabel.setBounds(197, 11, 227, 222); contentPane.add(lblNewLabel); //nomes JLabel jogador_1_Pontos = new JLabel(""); jogador_1_Pontos.setBounds(10, 109, 153, 23); jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos"); contentPane.add(jogador_1_Pontos); JLabel jogador_2_Pontos = new JLabel(""); jogador_2_Pontos.setBounds(10, 196, 153, 23); jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos"); contentPane.add(jogador_2_Pontos); JLabel jogador_1_Nome = new JLabel(j1.getNome()); jogador_1_Nome.setBounds(10, 78, 153, 23); contentPane.add(jogador_1_Nome); JLabel jogador_2_Nome = new JLabel(j2.getNome()); jogador_2_Nome.setBounds(10, 165, 153, 23); contentPane.add(jogador_2_Nome); JLabel vezJogador = new JLabel(""); vezJogador.setBounds(10, 230, 153, 23); contentPane.add(vezJogador); JLabel rodadasLbl = new JLabel("Prepare-se para o duelo!"); rodadasLbl.setFont(new Font("Times New Roman", Font.BOLD | Font.ITALIC, 14)); rodadasLbl.setBounds(232, 236, 167, 14); contentPane.add(rodadasLbl); JButton btnNewButton = new JButton("Jogar Dado"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(Menu.regra1) { if (j1.getPontos() < objetivo && j2.getPontos() < objetivo) { int i = dado.jogarDado(); if (vez == 0) { j1.aumentarPontos(i); jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos."); vezJogador.setText("Vez de " + j2.getNome()); vez = 1; } else { j2.aumentarPontos(i); jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos."); vezJogador.setText("Vez de " + j1.getNome()); vez = 0; } dado.showImagem(i, lblNewLabel); rodadas++; rodadasLbl.setText("Rodada " + String.valueOf(rodadas)); if (j1.getPontos() >= objetivo) { JOptionPane.showMessageDialog(null,j1.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } else if (j2.getPontos() >= objetivo) { JOptionPane.showMessageDialog(null,j2.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } } else { if (j1.getPontos() > j2.getPontos()) JOptionPane.showMessageDialog(null,j1.vitoria()); else if (j1.getPontos() == j2.getPontos()) JOptionPane.showMessageDialog(null,"Empatou"); else JOptionPane.showMessageDialog(null,j2.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } } else {//melhor de 3, ainda não está pronto if (rodadas <= 6) { int i = dado.jogarDado(); if (vez == 0) { j1.setPontosRodada(i); jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos."); vez = 1; } else { j2.setPontosRodada(i); jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos."); vez = 0; } if (j1.getPontosRodada() != 0 && j2.getPontosRodada() != 0) { if (j1.getPontosRodada() > j2.getPontosRodada()) { j1.aumentarPontos(i); j1.setPontosRodada(0); j2.setPontosRodada(0); } else if (j1.getPontosRodada() == j2.getPontosRodada()) { j1.aumentarPontos(i); j2.aumentarPontos(i); j1.setPontosRodada(0); j2.setPontosRodada(0); } else j2.aumentarPontos(i); j1.setPontosRodada(0); j2.setPontosRodada(0); } dado.showImagem(i, lblNewLabel); rodadas++; rodadasLbl.setText("Rodada " + String.valueOf(rodadas)); if (j1.getPontos() >= objetivo) { JOptionPane.showMessageDialog(null,j1.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } else if (j2.getPontos() >= objetivo) { JOptionPane.showMessageDialog(null,j2.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } } else { if (j1.getPontos() > j2.getPontos()) JOptionPane.showMessageDialog(null,j1.vitoria()); else if (j1.getPontos() == j2.getPontos()) JOptionPane.showMessageDialog(null,"Empatou"); else JOptionPane.showMessageDialog(null,j2.vitoria()); Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } } } }); btnNewButton.setBounds(10, 24, 100, 23); contentPane.add(btnNewButton); } else { Menu.btnNewButton.setEnabled(true); Menu.btnMelhorDe.setEnabled(true); dispose(); } } else { Menu.btnMelhorDe.setEnabled(true); Menu.btnNewButton.setEnabled(true); dispose(); } } } import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import javax.swing.ImageIcon; import javax.swing.UIManager; import java.awt.Font; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Toolkit; import java.awt.Color; public class Menu extends JFrame { private JPanel contentPane; static boolean regra1 = true; static JButton btnNewButton = new JButton("18 pontos"); static JButton btnMelhorDe = new JButton("Melhor de 3"); /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Menu frame = new Menu(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Menu() { setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png"))); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground")); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel lblNewLabel = new JLabel("Dados Arcade"); lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow")); lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18)); lblNewLabel.setBounds(236, 39, 138, 33); contentPane.add(lblNewLabel); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { regra1 = true; new View().setVisible(true); } }); btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground")); btnNewButton.setBounds(246, 83, 104, 23); contentPane.add(btnNewButton); btnMelhorDe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { regra1 = false; new View().setVisible(true); } }); btnMelhorDe.setForeground(Color.BLACK); btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground")); btnMelhorDe.setBounds(246, 124, 104, 23); contentPane.add(btnMelhorDe); JLabel label = new JLabel(""); label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg"))); label.setBounds(10, 0, 277, 192); contentPane.add(label); JLabel label_1 = new JLabel(""); label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png"))); label_1.setBounds(0, 0, 434, 261); contentPane.add(label_1); } } public class Jogador { private String nome = null; private int pontos; private int pontosRodada = 0; public void aumentarPontos(int pontos) { this.pontos += pontos; } public String vitoria() { return "Parabéns " + this.nome + " você venceu com " + String.valueOf(pontos) + "!!"; } public void setNome(String nome) { this.nome = nome; } public void setPontosRodada(int pontosRodada) { this.pontosRodada = pontosRodada; } public String getNome() { return nome; } public int getPontos() { return pontos; } public int getPontosRodada() { return pontosRodada; } } import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JLabel; public class Dado { private int numeroLados = 6; public int jogarDado() { int escolhido = new Random().nextInt(numeroLados) + 1; return escolhido; } public void showImagem(int i, JLabel lblNewLabel) { if( i == 1) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (3).jpg"))); else if(i == 2) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (4).jpg"))); else if(i == 3) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (5).jpg"))); else if(i == 4) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (6).jpg"))); else if(i == 5) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (7).jpg"))); else if(i == 6) lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/images (1).jpg"))); } }
  11. Realmente é melhor usar ArrayList, mas como eu não conhecia direito, preferi fazer meu próprio vetor, ainda vou adaptar para ArrayList no código. O método setExtrato adiciona uma String em um vetor de Strings (que cada conta tem) sempre que uma operação é realizada, algo tipo "Fulano depositou tanto na conta de Deltrano". O getExtrato é chamado no menu principal e ele exibe o vetor de Strings da conta que está logada. Quanto a classe Data estou um pouco indeciso sobre o que vou fazer com ela, creio que vou deixá-la como String e criar uma classe Time que poderá ser usada no setExtrato por exemplo
  12. TÓPICO DUPLICADO** Interface apenas define o que fazem as classes que a implementam, meu erro realmente foi falta de conhecimento do que era uma interface. Consegui resolver o problema criando um package para Sistema e ContaDiretor, mudando atributos/métodos como contas[ ] e totalContas para protected. ContaDiretor continua herdando de Conta e agora tem acesso exclusivo a atributos/métodos da classe Sistema package Sistema; import Conta.Conta; public class Sistema{ protected Conta contas[] = new Conta[100]; public Conta contaPublic = new Conta(); protected String nomeBanco = "Banco do Brasil"; protected int totalContas = 0; public String getNomeBanco() { return nomeBanco; } public void adicionaConta(Conta conta){ this.contas[totalContas] = conta; totalContas++; } //... } package Sistema; import Banco.Banco; import Conta.Conta; public class ContaDiretor extends Conta{ public static String nomeDoBanco; public void setNomeBanco(String nome) { Banco.reg1.nomeBanco = nome; // TODO Auto-generated constructor stub }
  13. TÓPICO DUPLICADO** Interface apenas define o que fazem as classes que a implementam, meu erro realmente foi falta de conhecimento do que era uma interface. Consegui resolver o problema criando um package para Sistema e ContaDiretor, mudando atributos/métodos como contas[ ] e totalContas para protected. ContaDiretor continua herdando de Conta e agora tem acesso exclusivo a atributos/métodos da classe Sistema package Sistema; import Conta.Conta; public class Sistema{ protected Conta contas[] = new Conta[100]; public Conta contaPublic = new Conta(); protected String nomeBanco = "Banco do Brasil"; protected int totalContas = 0; public String getNomeBanco() { return nomeBanco; } public void adicionaConta(Conta conta){ this.contas[totalContas] = conta; totalContas++; } //... } package Sistema; import Banco.Banco; import Conta.Conta; public class ContaDiretor extends Conta{ public static String nomeDoBanco; public void setNomeBanco(String nome) { Banco.reg1.nomeBanco = nome; // TODO Auto-generated constructor stub }
  14. Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema). Classe Conta package Conta; import Banco.Cliente; import Banco.Data; public class Conta { public int numero; protected double saldo; public String extrato[] = new String [100]; public Cliente titular = new Cliente(); public Data DataDeAbertura = new Data(); public void depositar (double saldo){ this.saldo += saldo; } public double getSaldo(){ return saldo; } protected boolean podeSacar(double valor){ if (saldo < valor) return false; else return true; } public void sacar (double valor, Conta conta){ if (podeSacar(valor)) { saldo -= valor; System.out.println("Novo Saldo: "); System.out.print(conta.getSaldo()); System.out.println(""); } else System.out.println("Saldo indisponível"); } public void transferencia (Conta c2){ } public void getExtrato () { for (int i = 0; i < extrato.length; i++) { if (extrato[i] == null){ break; } else System.out.println(extrato[i]); } } public void setExtrato(String nome, String atividade, double valor) { String extrato = nome + " " + atividade + " " + Double.toString(valor); for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public void setExtrato(String nome, String atividade, double valor, String nome2) { String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2; for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public boolean contaequals(Conta a){ return (this.titular.login == a.titular.login); } } Classe Sistema package Banco; import Conta.Conta; public class Sistema{ public Conta contas[] = new Conta[100]; public Conta contaPublic = new Conta(); private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ DE ALTERAR NOMEBANCO private int totalContas = 0; //E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA) public String getNomeBanco() { return nomeBanco; } public void adicionaConta(Conta conta){ this.contas[totalContas] = conta; totalContas++; } public Conta getConta(int pos) { return contas[pos]; } public Conta[] getContaVetor() {//retorna o vetor inteiro return contas; } } Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todas as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema? Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema. Como ContaDiretor terá acesso a duas classes ao mesmo tempo? Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema: package Conta; import Banco.InterfaceSistema; public class ContaDiretor extends Conta implements InterfaceSistema{ public static String nomeDoBanco; public void setNomeDoBanco(String nome) { this.nomeDoBanco = nome; // TODO Auto-generated constructor stub } public String getNomeBanco() { } } package Banco; import Conta.Conta; public interface InterfaceSistema { public String getNomeBanco(); public void adicionaConta(Conta conta); public Conta getConta(int pos); public Conta[] getContaVetor(); }
  15. Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema). Classe Conta package Conta; import Banco.Cliente; import Banco.Data; public class Conta { public int numero; protected double saldo; public String extrato[] = new String [100]; public Cliente titular = new Cliente(); public Data DataDeAbertura = new Data(); public void depositar (double saldo){ this.saldo += saldo; } public double getSaldo(){ return saldo; } protected boolean podeSacar(double valor){ if (saldo < valor) return false; else return true; } public void sacar (double valor, Conta conta){ if (podeSacar(valor)) { saldo -= valor; System.out.println("Novo Saldo: "); System.out.print(conta.getSaldo()); System.out.println(""); } else System.out.println("Saldo indisponível"); } public void transferencia (Conta c2){ } public void getExtrato () { for (int i = 0; i < extrato.length; i++) { if (extrato[i] == null){ break; } else System.out.println(extrato[i]); } } public void setExtrato(String nome, String atividade, double valor) { String extrato = nome + " " + atividade + " " + Double.toString(valor); for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public void setExtrato(String nome, String atividade, double valor, String nome2) { String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2; for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public boolean contaequals(Conta a){ return (this.titular.login == a.titular.login); } } Classe Sistema package Banco; import Conta.Conta; public class Sistema{ public Conta contas[] = new Conta[100]; public Conta contaPublic = new Conta(); private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ DE ALTERAR NOMEBANCO private int totalContas = 0; //E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA) public String getNomeBanco() { return nomeBanco; } public void adicionaConta(Conta conta){ this.contas[totalContas] = conta; totalContas++; } public Conta getConta(int pos) { return contas[pos]; } public Conta[] getContaVetor() {//retorna o vetor inteiro return contas; } } Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todas as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema? Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema. Como ContaDiretor terá acesso a duas classes ao mesmo tempo? Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema: package Conta; import Banco.InterfaceSistema; public class ContaDiretor extends Conta implements InterfaceSistema{ public static String nomeDoBanco; public void setNomeDoBanco(String nome) { this.nomeDoBanco = nome; // TODO Auto-generated constructor stub } public String getNomeBanco() { } } package Banco; import Conta.Conta; public interface InterfaceSistema { public String getNomeBanco(); public void adicionaConta(Conta conta); public Conta getConta(int pos); public Conta[] getContaVetor(); }
  16. Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema). Classe Conta package Conta; import Banco.Cliente; import Banco.Data; public class Conta { public int numero; protected double saldo; public String extrato[] = new String [100]; public Cliente titular = new Cliente(); public Data DataDeAbertura = new Data(); public void depositar (double saldo){ this.saldo += saldo; } public double getSaldo(){ return saldo; } protected boolean podeSacar(double valor){ if (saldo < valor) return false; else return true; } public void sacar (double valor, Conta conta){ if (podeSacar(valor)) { saldo -= valor; System.out.println("Novo Saldo: "); System.out.print(conta.getSaldo()); System.out.println(""); } else System.out.println("Saldo indisponível"); } public void transferencia (Conta c2){ } public void getExtrato () { for (int i = 0; i < extrato.length; i++) { if (extrato[i] == null){ break; } else System.out.println(extrato[i]); } } public void setExtrato(String nome, String atividade, double valor) { String extrato = nome + " " + atividade + " " + Double.toString(valor); for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public void setExtrato(String nome, String atividade, double valor, String nome2) { String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2; for (int i = 0; i < this.extrato.length; i++) { if (this.extrato[i] == null) { this.extrato[i] = extrato; break; } } } public boolean contaequals(Conta a){ return (this.titular.login == a.titular.login); } } Classe Sistema package Banco; import Conta.Conta; public class Sistema{ public Conta contas[] = new Conta[100]; public Conta contaPublic = new Conta(); private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ DE ALTERAR NOMEBANCO private int totalContas = 0; //E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA) public String getNomeBanco() { return nomeBanco; } public void adicionaConta(Conta conta){ this.contas[totalContas] = conta; totalContas++; } public Conta getConta(int pos) { return contas[pos]; } public Conta[] getContaVetor() {//retorna o vetor inteiro return contas; } } Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todos as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema? Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema. Como ContaDiretor terá acesso a duas classes ao mesmo tempo? Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema: package Conta; import Banco.InterfaceSistema; public class ContaDiretor extends Conta implements InterfaceSistema{ public static String nomeDoBanco; public void setNomeDoBanco(String nome) { this.nomeDoBanco = nome; // TODO Auto-generated constructor stub } public String getNomeBanco() { } } package Banco; import Conta.Conta; public interface InterfaceSistema { public String getNomeBanco(); public void adicionaConta(Conta conta); public Conta getConta(int pos); public Conta[] getContaVetor(); }
  17. Resolveu, eu pensava que para instanciar um objeto eu necessariamente precisava dar um nome para ele. Pensava que algo assim não rodaria. // Instancia cada um dos elementos do vetor for(int i = 0; i < pessoas.length; ++i) { pessoas[i] = new Pessoa11(); }
  18. Era o que eu temia. (Preencher um vetor null com outro vetor null não funcionou) Nesse código o usuário precisa digitar a quantidade de pessoas que serão analisadas, de acordo com o valor fornecido serão criados os objetos Pessoa11. //Maneira 1: Classe principal Pessoa11 pessoa[] = new Pessoa11[numbers]; //numbers é fornecido pelo usuário for (int i = 0; i < pessoa.length; i++) v1.adicionaPessoa(pessoa[i); // Preenche o vetor Aparentemente eu teria que instanciar uma quantidade x de objetos e deixá-los disponíveis para o usuário. Tipo criar 100 objetos pessoas, porém o usuário deverá pedi para analisar menos de 100 pessoas. Creio que essa não é a forma correta de fazer isso, e também não consegui pensar em um método que instancie X objetos.
  19. Quando na main vou chamar os métodos da classe Pessoa11 através de um vetor pessoas que se encontra na classe Vetor11, ocorre o erro java.lang.NullPointerException; Quando um vetor de objetos é criados eles são "inicializados" como null, eu criei um código que deveria preencher esse vetor, mas parece que não funcionou. Essa é a classe Vetor11 que cria o vetor de pessoas. public class Vetor11 { private Pessoa11 pessoas[] = new Pessoa11[100]; //adiciona aluno public void adicionaPessoa(Pessoa11 pessoa){ for(int i = 0; i < pessoas.length;i++){ if(pessoas[i] == null){ pessoas[i] = pessoa; break; } } } public Pessoa11 getPessoa(int pos) {//retorna os objetos return pessoas[pos]; } Essa abaixo se encontra na classe principal. Cheguei a pensar que o problema estaria no método adicionarPessoa que pede uma pessoa e recebe um vetor de pessoas, alterei o que sabia e continuou sem funcionar //Maneira 1: Classe principal Pessoa11 pessoa[] = new Pessoa11[numbers]; for (int i = 0; i < pessoa.length; i++) v1.adicionaPessoa(pessoa[i); // Preenche o vetor //Maneira 2: Classe principal Pessoa11 pessoa[] = new Pessoa11[numbers]; Pessoa11 nada = new Pessoa11(); for (int i = 0; i < pessoa.length; i++) { nada = pessoa[i]; v1.adicionaPessoa(nada); } // Preenche o vetor Logo na primeira linha em que tento usar um método da classe Pessoa11 acontece esse erro for (int i = 0; i < numbers; i++) { int n = i + 1; while (i < numbers) { System.out.printf("Digite o nome da pessoa %d:\n", n); String stri = scan.nextLine(); if (eString(stri)) { v1.getPessoa(i).setNome(stri);//Exception in thread "main" java.lang.NullPointerException break; } else System.out.println("O nome deve conter apenas caracteres alfabéticos!!"); } }
  20. Malditos typos. E eu aqui tentando entender a psicologia que o c++ estava o usando.
  21. Sou iniciante em C++, estava seguindo um tutorial(25/06/18) e fiz esse código: #include <iostream> #include <fstream> #include<string> using namespace std; int main() { cout << "File Reader" << endl; const char* fileName = "myFile.txt"; ifstream inFile(fileName); string line = ""; if (inFile.is_open()){ while (getline (inFile, line)); {//aparentemente só é executado uma vez cout << line <<'\n';//deveria exibir linha por linha } } else cout << "Could not open file: " << fileName << endl; inFile.close(); return 0; } O arquivo em questão possui apenas três linhas Essa é a linha um Segunda linha aqui 2458631 23 O código deveria ler linha por linha do texto e imprimir na tela, porém ele apenas lê a última linha e imprime File Reader 2458631 23 Se eu declaro uma variável i para contar quantas vezes o código repete, ela recebe o valor 1 indicando que o loop funciona apenas uma vez. int i = 0; if (inFile.is_open()){ while (getline (inFile, line)); { i++; cout << line <<'\n'; cout << i << endl; } } Por quê esse código não funciona e como realizar a leitura cada linha de um arquivo txt? Ps: Não tentei usar o for, me interessa descobri o erro desse. Ps2: No vídeo o código funcionou.
  22. Você não falou para quê serve esse programa, ou qual o erro que você encontrou nele. Comentei o código todo, e acredito que o problema que você encontrou esteja na linha 21. É sempre bom comentar o código e imprimir textos informando para o usuário o que diabos está acontecendo. import java.util.Scanner; public class Main10 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Quantas vezes o programa deve repetir?"); int t = scan.nextInt();// O valor de t define quantas vezes o loop continuará int min; while(t-- !=0) { //System.out.println("Quantos inteiros irão ser digitados?"); //int n = scan.nextInt() - 1; //Essa é uma maneira de pedir essa informação para o usuário System.out.println("Qual o comprimento do vetor?"); int n = scan.nextInt();// O valor de n define quantos arrays o vetor r terá int[] r = new int[n]; min = 10000; //Aqui o usuário insere o valor de cada array for(int i=0; i<r.length; i++) { // Dessa maneira o último array fica vazio, o certo seria System.out.println("Digite um inteiro: ");//for(int i=0; i<=r.length; i++) r[i] = scan.nextInt(); } for(int i=0; i<r.length; i++) {// min é reduzido para um valor menor/igual que r[i] while(r[i]%min != 0) { min--; } } for(int i =0; i<n; i++) {// O valor de cada array é divido por min r[i]= r[i]/min; System.out.printf("O valor da posição %d foi alterado \n", i); } for(int i =0; i<n; i++) {//Aqui ele exibe o novo valor de cada array System.out.print(r[i]+" "); } } } } Qualquer coisa não hesite em perguntar.
  23. Fiz o que você disse, o que estava faltando mesmo era deixar as variáveis acessíveis a partir da classe (algo que eu não sabia). Quando o método main reexecutava linhas como essas: //números aleatórios double m1[] = new double [41]; double m2[] = new double [41]; double m3[] = new double [41]; double m4[] = new double [41]; Ele redefinia seus valores como zero, agora elas são declaradas antes da função main, mantendo dessa forma o valores definidos na primeira vez. Sobre a questão do array 0 está vazio, como são 40 alunos (1 - 40) quis deixar o índice do vetor correspondendo à posição do aluno. Mas eu corrigi isso adicionando um (i + 1) na saída. Criar outros métodos ajudou bastante, porém não vi necessidade de criar novos métodos para o menu 2. Prometo da uma olhada nesse vídeo que me recomendastes. Segue o código corrigido a seguir: import java.util.Scanner; import java.util.Random; public class Quest05 { private static Scanner scanner = new Scanner (System.in); //números aleatórios private static double m1[] = new double [40]; private static double m2[] = new double [40]; private static double m3[] = new double [40]; private static double m4[] = new double [40]; private static double start = 0; private static double end = 10; private static int repeat = 0;//loop private static boolean nextBreak = false; //preencher notas public static void preencherNotas() { //new Random().nextDouble() for (int i = 0; i < m1.length; i++) { //double aleatório de 0 - 1; m1[i] = start + (new Random().nextDouble() * (end - start)); } for (int i = 0; i < m2.length; i++) { m2[i] = start + (new Random().nextDouble() * (end - start)); } for (int i = 0; i < m3.length; i++) { m3[i] = start + (new Random().nextDouble() * (end - start)); } for (int i = 0; i < m4.length; i++) { m4[i] = start + (new Random().nextDouble() * (end - start)); } } public static double eDouble(String str) { double valid; try { str = str.replace(",", "."); valid = Double.parseDouble(str); } catch (NumberFormatException e) { valid = 121; } return valid; } public static int eInteger(String str) { int valid; try { valid = Integer.parseInt(str); } catch (NumberFormatException e) { valid = 121; } return valid; } public static boolean loop(String restart) { // menu sim ou não char temp = 'd'; boolean end = false; while (temp != 's') { //O loop só é quebrado se o usuário entrar com 's'ou 'n' if (restart.length() > 1 || restart.equalsIgnoreCase("")) restart = "p"; temp = restart.charAt(0); if (temp == 'n') { end = true; //encerra o programa break; } else if (temp != 's') { System.out.println("Opção inválida!!"); restart = scanner.nextLine(); } } return end; } //receber notas public static void receberNotas(double m[]) { nextBreak = false; for (int i = 0; i < m.length; i++) { String nota = "j"; int loop2 = 0; while (loop2 == 0) { System.out.println("Digite a primeira nota do aluno " + (i + 1)); nota = scanner.nextLine(); if (nota.equals("Sair")) { System.out.println("Fim de Programa."); repeat++; nextBreak = true; break; } else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) { m[i] += eDouble(nota); loop2++; } else { System.out.println("Valor digitado inválido!"); System.out.println("Deseja tentar inserir esta nota novamente?"); String answer = scanner.nextLine(); if (loop(answer)) { loop2++; m[i] = 0; } } } if (nextBreak) break; } } public static void main(String[] args) { boolean newOption = false; System.out.println("Bem vindo ao Medianator 4000!!!"); // Boas vindas System.out.println("Tecle [ENTER] para continuar: "); String enter = "nada"; while (!enter.equals("")) { enter = scanner.nextLine();//vai ler o que o usuário digitar //O loop só é quebrado se o usuário entrar com \n if (enter.equals("")) break; } while (repeat == 0) { nextBreak = false; //menu 1 System.out.println("Escolha a opção desejada: "); if (newOption) System.out.println("0 - Utilizar banco de dados existente "); System.out.println("1 - Gerar novo banco de dados"); System.out.println("2 - Inserir novos dados"); System.out.println("3 - Sair"); String op = "e"; int menu1 = 0; while (menu1 == 0) { op = scanner.nextLine(); int option = eInteger(op); if (!newOption && option == 0) option = 121; switch (option) { case 0: menu1++; break; case 1: //As médias são preenchidas com números aleatórios preencherNotas(); menu1++; break; case 2:// O usuário insere as notas de cada media System.out.println("Primeira avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); receberNotas(m1); if (nextBreak) break; else System.out.println(nextBreak); System.out.println("Segunda avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); receberNotas(m2); if (nextBreak) break; System.out.println("Terceira avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); receberNotas(m3); if (nextBreak) break; System.out.println("Quarta avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); receberNotas(m4); menu1++; break; case 3: System.out.println("Fim de Programa."); repeat ++; nextBreak = true; break; default: System.out.println("Opção inválida tente novamente!!"); break; } if (nextBreak) break; } if (nextBreak) break; //menu 2 int menu2 = 1; System.out.println("Escolha um opção: "); System.out.println("1 - Exibir média anual de cada aluno"); System.out.println("2 - Exibir média da turma"); System.out.println("3 - Exibir média de um aluno específico"); System.out.println("4 - Voltar para o menu anterior"); do { op = scanner.nextLine(); int option2 = eInteger(op); double mediaAlunos[] = new double [40]; double sum = 0; double mediaTurma = 0; if (option2 != 4) { for (int i = 0; i < 40; i++) { // Calcula a média de cada aluno mediaAlunos[i] = (m1[i] + m2[i] + m3[i] + m4 [i]) / 4; } } switch (option2){ case 1: System.out.println("A média de cada aluno: "); for (int i = 0; i < 40; i++) { System.out.println("Aluno " + (i + 1)); System.out.printf(" %.2f\n", mediaAlunos[i]); } menu2++; break; case 2: for(int i2 = 0; i2 < mediaAlunos.length; i2++){ sum = sum + mediaAlunos[i2]; } mediaTurma = sum / 40; System.out.println("A média da turma é: "); System.out.printf(" %.2f\n", mediaTurma); menu2++; break; case 3: int aluno = 0; int selectThis = 0; while (selectThis == 0) { System.out.println("Digite o número do aluno desejado: "); op = scanner.nextLine(); aluno = eInteger(op); if (aluno > 0 && aluno <= 40) { System.out.printf("A média do aluno %d é: %.2f \n", aluno, mediaAlunos[aluno - 1]); menu2++; break; } else { System.out.println("Aluno inexistente!"); System.out.println("Deseja tentar novamente?"); String answer = scanner.nextLine(); if (loop(answer)) selectThis++; } } break; case 4: repeat = 0; menu2++; break; default: System.out.println("Opção inválida!"); menu2 = 0; break; } if (option2 >= 0 && option2 < 4) { newOption = true; System.out.println("Deseja continuar(s/n)? "); int v = 0; String restart = scanner.nextLine(); while (v == 0) { if (loop(restart)) { System.out.println("Fim de Programa."); v++; repeat++; } else v++; } } }while (menu2 == 0); } } }
  24. Sou iniciante em Java, esse código calcula e exibe a média de quatro notas (cada uma armazenada em um vetor). Possui dois menus: menu 1: 1 - Gerar dados - (Os vetores são preenchidos com doubles aleatórios de 0-10) 2 - Inserir dados - (O usuário insere o valor de cada vetor) 3 - Sair menu 2: 1 - Exibir a média anual de cada aluno 2 - Exibir média da turma 3 - Exibir média de um aluno específico 4 - Voltar ao menu anterior Após o passar pelo segundo menu (escolhendo 1, 2 ou 3) o usuário tem a opção continuar (loop), quando isso acontece o menu 1 ganha uma nova opção: 0 - Utilizar banco de dados existente. (Essa opção pularia a definição de valores dos vetores (pois eles já estariam definidos)) Agora chegamos no problema: Ao invés de manter os dados definidos anteriormente, eles (os vetores) estão ficando vazios, retornando 0,00. Como manter os dados informados na primeira repetição do loop? Segue aí o código: import java.util.Scanner; import java.util.Random; public class Quest05 { public static double eDouble(String str) { double valid; try { str = str.replace(",", "."); valid = Double.parseDouble(str); } catch (NumberFormatException e) { valid = 121; } return valid; } public static int eInteger(String str) { int valid; try { valid = Integer.parseInt(str); } catch (NumberFormatException e) { valid = 121; } return valid; } public static boolean loop(String restart) { // menu sim ou não Scanner scanner = new Scanner (System.in); char temp = 'd'; boolean end = false; while (temp != 's') { //O loop só é quebrado se o usuário entrar com 's'ou 'n' if (restart.length() > 1 || restart.equalsIgnoreCase("")) restart = "p"; temp = restart.charAt(0); if (temp == 'n') { end = true; //encerra o programa break; } else if (temp != 's') { System.out.println("Opção inválida!!"); restart = scanner.nextLine(); } } return end; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean newOption = false; System.out.println("Bem vindo ao Medianator 4000!!!"); // Boas vindas System.out.println("Tecle [ENTER] para continuar: "); String enter = "nada"; while (!enter.equals("")) { enter = scanner.nextLine();//vai ler o que o usuário digitar //O loop só é quebrado se o usuário entrar com \n if (enter.equals("")) break; } int repeat = 0;//loop while (repeat == 0) { boolean nextBreak = false; //números aleatórios double m1[] = new double [41]; double m2[] = new double [41]; double m3[] = new double [41]; double m4[] = new double [41]; //menu 1 System.out.println("Escolha a opção desejada: "); if (newOption) System.out.println("0 - Utilizar banco de dados existente "); System.out.println("1 - Gerar novo banco de dados"); System.out.println("2 - Inserir novos dados"); System.out.println("3 - Sair"); String op = "e"; int menu1 = 0; while (menu1 == 0) { op = scanner.nextLine(); int option = eInteger(op); if (!newOption && option == 0) option = 121; //new Random().nextDouble(); //double aleatório de 0 - 1; double start = 0; double end = 10; switch (option) { case 0: menu1++; break; case 1: //As médias são preenchidas com números aleatórios for (int i = 1; i < m1.length; i++) { m1[i] += start + (new Random().nextDouble() * (end - start)); } for (int i = 1; i < m2.length; i++) { m2[i] += start + (new Random().nextDouble() * (end - start)); } for (int i = 1; i < m3.length; i++) { m3[i] += start + (new Random().nextDouble() * (end - start)); } for (int i = 1; i < m4.length; i++) { m4[i] += start + (new Random().nextDouble() * (end - start)); } menu1++; break; case 2:// O usuário insere as notas de cada media String nota = "j"; System.out.println("Primeira avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); for (int i = 1; i < m1.length; i++) { int loop2 = 0; while (loop2 == 0) { System.out.println("Digite a primeira nota do aluno " + i); nota = scanner.nextLine(); if (nota.equals("Sair")) { System.out.println("Fim de Programa."); repeat++; nextBreak = true; break; } else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) { m1[i] += eDouble(nota); loop2++; } else { System.out.println("Valor digitado inválido!"); System.out.println("Deseja tentar inserir esta nota novamente?"); String answer = scanner.nextLine(); if (loop(answer)) { loop2++; m1[i] = 0; } } } if (nextBreak) break; } if (nextBreak) break; System.out.println("Segunda avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); for (int i = 1; i < m2.length; i++) { int loop2 = 0; while (loop2 == 0) { System.out.println("Digite a segunda nota do aluno " + i); nota = scanner.nextLine(); if (nota.equals("Sair")) { System.out.println("Fim de Programa."); repeat++; nextBreak = true; break; } else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) { m2[i] += eDouble(nota); loop2++; } else { System.out.println("Valor digitado inválido!"); System.out.println("Deseja tentar inserir esta nota novamente?"); String answer = scanner.nextLine(); if (loop(answer)) { loop2++; m2[i] = 0; } } } if (nextBreak) break; } if (nextBreak) break; System.out.println("Terceira avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); for (int i = 1; i < m3.length; i++) { int loop2 = 0; while (loop2 == 0) { System.out.println("Digite a terceira nota do aluno " + i); nota = scanner.nextLine(); if (nota.equals("Sair")) { System.out.println("Fim de Programa."); repeat++; nextBreak = true; break; } else if(eDouble(nota) >= 0 && eDouble(nota) <= 10) { m3[i] += eDouble(nota); loop2++; } else { System.out.println("Valor digitado inválido!"); System.out.println("Deseja tentar inserir esta nota novamente?"); String answer = scanner.nextLine(); if (loop(answer)) { loop2++; m3[i] = 0; } } } if (nextBreak) break; } if (nextBreak) break; System.out.println("Quarta avaliação."); System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação."); for (int i = 1; i < m4.length; i++) { int loop2 = 0; while (loop2 == 0) { System.out.println("Digite a quarta nota do aluno " + i); nota = scanner.nextLine(); if (nota.equals("Sair")) { System.out.println("Fim de Programa."); repeat++; nextBreak = true; break; } else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) { m4[i] += eDouble(nota); loop2++; } else { System.out.println("Valor digitado inválido!"); System.out.println("Deseja tentar inserir esta nota novamente?"); String answer = scanner.nextLine(); if (loop(answer)) { loop2++; m4[i] = 0; } } } if (nextBreak) break; } menu1++; break; case 3: System.out.println("Fim de Programa."); repeat ++; nextBreak = true; break; default: System.out.println("Opção inválida tente novamente!!"); break; } if (nextBreak) break; } if (nextBreak) break; //menu 2 int menu2 = 1; System.out.println("Escolha um opção: "); System.out.println("1 - Exibir média anual de cada aluno"); System.out.println("2 - Exibir média da turma"); System.out.println("3 - Exibir média de um aluno específico"); System.out.println("4 - Voltar para o menu anterior"); do { op = scanner.nextLine(); int option2 = eInteger(op); double mediaAlunos[] = new double [41]; double sum = 0; double mediaTurma = 0; if (option2 != 4) { for (int i = 1; i < 41; i++) { // Calcula a média de cada aluno mediaAlunos[i] = (m1[i] + m2[i] + m3[i] + m4 [i]) / 4; } } switch (option2){ case 1: System.out.println("A média de cada aluno: "); for (int i = 1; i < 41; i++) { System.out.println("Aluno " + i); System.out.printf(" %.2f\n", mediaAlunos[i]); } menu2++; break; case 2: for(int i2 = 1; i2 < mediaAlunos.length; i2++){ sum = sum + mediaAlunos[i2]; } mediaTurma = sum / 40; System.out.println("A média da turma é: "); System.out.printf(" %.2f\n", mediaTurma); menu2++; break; case 3: int aluno = 0; int selectThis = 0; while (selectThis == 0) { System.out.println("Digite o número do aluno desejado: "); op = scanner.nextLine(); aluno = eInteger(op); if (aluno > 0 && aluno < 41) { System.out.printf("A média do aluno %d é: %.2f \n", aluno, mediaAlunos[aluno]); menu2++; break; } else { System.out.println("Aluno inexistente!"); System.out.println("Deseja tentar novamente?"); String answer = scanner.nextLine(); if (loop(answer)) selectThis++; } } break; case 4: repeat = 0; menu2++; break; default: System.out.println("Opção inválida!"); menu2 = 0; break; } if (option2 >= 0 && option2 < 4) { newOption = true; System.out.println("Deseja continuar(s/n)? "); int v = 0; String restart = scanner.nextLine(); while (v == 0) { if (loop(restart)) { System.out.println("Fim de Programa."); v++; repeat++; } else v++; } } }while (menu2 == 0); } } }
  25. Resolveu todos os problemas relacionados a esse assunto. Entendi que cada caso é um caso quando se fala sobre como tratar exceção. Declaro por tanto encerrado esse tópico. Agradeço aos envolvidos

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...