Jump to content

klonder

Members
  • Content count

    969
  • Joined

  • Last visited

  • Days Won

    2

klonder last won the day on September 21 2009

klonder had the most liked content!

Community Reputation

14 Levemente Bom

About klonder

  • Rank
    Klonder
  • Birthday 09/11/1981

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    Brasília
  • Interesses
    JavaFx, Android.
  1. Olá a todos! Estou há 3 dias pesquisando sobre como assinar digitalmente um arquivo pdf com Python, porém nenhuma proposta funcionou no Python 3.8. O meu problema consiste no seguinte: Crio contratos no word e salvo no formato PDF em uma pasta. O que eu preciso é criar um aplicativo em Python que abra um arquivo pdf já criado e assine-o digitalmente através de um Certificado Digital pfx. Essa assinatura deveria ser inserida no final de cada documento. Já tentei várias ferramentas, porém nenhuma funcionou no Python 3.8. Alguém tem conhecimento sobre o assunto, utiliza, ou saberia dar alguma dica? Obrigado!
  2. Aproveitando o exemplo acima, deixo outra possibilidade para controle de eventos focusIn/focusOut. Com o método focusChanged signal of QApplication, foi necessário fazer algumas adaptações, mas deixei o código comentado para facilitar a referência: from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QComboBox, QLineEdit, QCompleter from PyQt5.QtCore import QSize, Qt, QSortFilterProxyModel, QStringListModel class Ui_Autocomplete(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 200, 800, 600) self.setWindowTitle('Autocomplete com combobox') self.cboxEstado = QComboBox(self) self.cboxEstado.move(50, 50) self.cboxEstado.addItem("Acre") self.cboxEstado.addItem("Amazonas") self.cboxEstado.addItem("Amapá") self.cboxEstado.addItem("Pará") self.cboxEstado.addItem("Rondônia") self.cboxEstado.addItem("Roraima") self.cboxEstado.addItem("Tocantins") self.cboxEstado.addItem("Distrito Federal") self.cboxEstado.addItem("Goiás") self.cboxEstado.addItem("Mato Grosso") self.cboxEstado.addItem("Mato Grosso do Sul") self.cboxEstado.addItem("Alagoas") self.cboxEstado.addItem("Bahia") self.cboxEstado.addItem("Ceará") self.cboxEstado.addItem("Maranhão") self.cboxEstado.addItem("Piauí") self.cboxEstado.addItem("Pernambuco") self.cboxEstado.addItem("Paraíba") self.cboxEstado.addItem("Rio Grande do Norte") self.cboxEstado.addItem("Sergipe") self.cboxEstado.addItem("Paraná") self.cboxEstado.addItem("Rio Grande do Sul") self.cboxEstado.addItem("Santa Catarina") self.cboxEstado.addItem("Espírito Santo") self.cboxEstado.addItem("Minas Gerais") self.cboxEstado.addItem("São Paulo") self.cboxEstado.addItem("Rio de Janeiro") self.cboxEstado.setEditable(True) self.cboxEstado.completer().setCompletionMode(QCompleter.PopupCompletion) self.cboxEstado.completer().setFilterMode(Qt.MatchContains) self.cboxEstado.completer().setCaseSensitivity(QtCore.Qt.CaseInsensitive) #self.cboxEstado.focusOutEvent = self.pedeuFoco QtWidgets.qApp.focusChanged.connect(self.on_focusChanged) self.leRegiao = QLineEdit(self) self.leRegiao.move(250,50) self.leRegiao.resize(200, 22) def on_focusChanged(self, old, now): if now == self.leRegiao: self.leRegiao.setText(self.cboxEstado.currentText()) if old == self.cboxEstado: occur = 0 for i in range(len(self.cboxEstado)): if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): occur = occur+1 if occur == 0: self.leRegiao.setText("") self.cboxEstado.lineEdit().setFocus() self.cboxEstado.lineEdit().selectAll() #else: #Retira o cursor do widget #QComboBox.focusOutEvent(self.cboxEstado,event) #def pedeuFoco(self,event): #occur = 0 #for i in range(len(self.cboxEstado)): #if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): #occur = occur+1 #if occur == 0: #self.cboxEstado.lineEdit().setFocus() #self.cboxEstado.lineEdit().selectAll() #else: ##Retira o cursor do widget #QComboBox.focusOutEvent(self.cboxEstado,event) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = Ui_Autocomplete() mainWin.show() sys.exit(app.exec_())
  3. Olá a todos(as)! Estava há 3 dias pesquisando sobre como resolver um problema que estava enfrentando em meu sistema, que consistia no seguinte: Implantar um Combobox com dados vindos do banco. Esse combobox deveria ser editável e apresentar os valores em seu popup suspenso. À medida em que o usuário fosse digitando, o autocomplete faria a busca em todos os valores já cadastrados e mostraria os compatíveis (procedimento até então comum em qualquer autocomplete). Todavia, o combobox só poderia perder o foco caso o texto inserido fosse exatamente igual a um dos valores existentes no popup, ou seja, não poderia ser inserido nada que já não estivesse cadastrado anteriormente e presente na lista de valores. Após muito pesquisar, cheguei a um resultado muito satisfatório que compartilho com vocês, visto que varri a internet inteira à procura desse código e não encontrei em lugar nenhum. PyQt5 é extremamente pobre em tutoriais, principalmente em português. Segue o código que poderá ajudar quem precise: from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QComboBox, QLineEdit, QCompleter from PyQt5.QtCore import QSize, Qt, QSortFilterProxyModel, QStringListModel class Ui_Autocomplete(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 200, 800, 600) self.setWindowTitle('Autocomplete com combobox') self.cboxEstado = QComboBox(self) self.cboxEstado.move(50, 50) self.cboxEstado.addItem("Acre") self.cboxEstado.addItem("Amazonas") self.cboxEstado.addItem("Amapá") self.cboxEstado.addItem("Pará") self.cboxEstado.addItem("Rondônia") self.cboxEstado.addItem("Roraima") self.cboxEstado.addItem("Tocantins") self.cboxEstado.addItem("Distrito Federal") self.cboxEstado.addItem("Goiás") self.cboxEstado.addItem("Mato Grosso") self.cboxEstado.addItem("Mato Grosso do Sul") self.cboxEstado.addItem("Alagoas") self.cboxEstado.addItem("Bahia") self.cboxEstado.addItem("Ceará") self.cboxEstado.addItem("Maranhão") self.cboxEstado.addItem("Piauí") self.cboxEstado.addItem("Pernambuco") self.cboxEstado.addItem("Paraíba") self.cboxEstado.addItem("Rio Grande do Norte") self.cboxEstado.addItem("Sergipe") self.cboxEstado.addItem("Paraná") self.cboxEstado.addItem("Rio Grande do Sul") self.cboxEstado.addItem("Santa Catarina") self.cboxEstado.addItem("Espírito Santo") self.cboxEstado.addItem("Minas Gerais") self.cboxEstado.addItem("São Paulo") self.cboxEstado.addItem("Rio de Janeiro") self.cboxEstado.setEditable(True) self.cboxEstado.completer().setCompletionMode(QCompleter.PopupCompletion) self.cboxEstado.completer().setFilterMode(Qt.MatchContains) self.cboxEstado.completer().setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.cboxEstado.focusOutEvent = self.pedeuFoco self.leRegiao = QLineEdit(self) self.leRegiao.move(250,50) self.leRegiao.resize(200, 22) def pedeuFoco(self,event): occur = 0 for i in range(len(self.cboxEstado)): if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): occur = occur+1 if occur == 0: self.cboxEstado.lineEdit().setFocus() self.cboxEstado.lineEdit().selectAll() else: #Retira o cursor do widget QComboBox.focusOutEvent(self.cboxEstado,event) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = Ui_Autocomplete() mainWin.show() sys.exit(app.exec_())
  4. Boas galera! Vou deixar aqui um código que acabei de criar de um método que recebe a data de nascimento em formato de string e retorna a idade. Eu tinha esse código em JAVA, fiz umas melhorias e adaptei para Python, para o novo sistema que estou desenvolvendo. Deixo aí para quem precisar e também para minhas pesquisas futuras: O método retorna a idade no padrão: AAa | AAa MMm | AAa MMm DDd, exemplos: 38a | 38a 14m | 38a 14m 5d Deixei o parâmetro "tipo" podendo receber "a", "m", "d" apenas para facilitar a referência a "anos", "meses" e "dias", mas sintam-se à vontade para alterar depois! Boa sorte! from datetime import datetime,date def calcularIdade(self,dtYYYYMMDD,tipo): #dtYYYYMMDD: string de data no formato YYYY-MM-DD (exemplo: padrão SQL) #tipo: Pode receber "a","m","d" -> a: retorna YYa | m: retorna YYa MMd | d: retorna YYa MMm DDd dtDN = datetime.strptime(dtYYYYMMDD, '%Y-%m-%d').date() dtHoje = date.today() anoNasc = int(dtDN.strftime('%Y')) anoHoje = int(dtHoje.strftime('%Y')) mesNasc = int(dtDN.strftime('%m')) mesHoje = int(dtHoje.strftime('%m')) diaNasc = int(dtDN.strftime('%d')) diaHoje = int(dtHoje.strftime('%d')) dtNiver = datetime.strptime(str(anoHoje)+"-"+str(mesNasc)+"-"+str(diaNasc), '%Y-%m-%d').date() diffAnos = anoHoje-anoNasc diffMeses = mesHoje-mesNasc diffDias = diaHoje-diaNasc if dtHoje<dtNiver:#Ainda não fez aniversário esse ano! diffAnos = anoHoje-anoNasc-1#Corrigindo o ano, pois ainda não fez aniversário diffMeses = 12+diffMeses#Corrigindo os meses/diffMeses é negativo!!! if diaHoje < diaNasc:#O mês ainda não virou diffMeses = diffMeses-1 #Para o cálculo dos dias, é importante avaliar uma série de variáveis: Mês com 28,20,30 ou 31 dias mes_anterior_31d = [1,2,4,6,9,11] mes_anterior_30d = [5,7,8,10,12] if mesHoje in mes_anterior_31d: diffDias = (31-diaNasc)+diaHoje elif mesHoje in mes_anterior_30d: diffDias = (30-diaNasc)+diaHoje else: if anoHoje%4 == 0:#Cálculos para anos bissextos diffDias = (29-diaNasc)+diaHoje else:#Anos não bissextos diffDias = (28-diaNasc)+diaHoje if tipo == "a": return str(diffAnos)+"a" elif tipo == "m": return str(diffAnos)+"a "+str(diffMeses)+"m " else: return str(diffAnos)+"a "+str(diffMeses)+"m "+str(diffDias)+"d" Exemplo de chamada: print(self.calcularIdade("1981-09-11","d"))
  5. Após muita, muita pesquisa, vou deixar um código de um template com 3 colunas verticais, sendo que a coluna do meio responde ao tamanho da janela e as laterais podem responder ao tamanho ou serem fixas (vai do gosto do desenvolvedor). Há também a possibilidade de alterar rapidamente a posição entre as colunas laterais, bastando alterar o float de cada uma delas, sem mexer na marcação. Motivo do post: Pode ser que ajude alguém com o mesmo problema. Postarei também para minhas consultas futuras. Motivo 2: O site do Maujor tem um bom exemplo (https://www.maujor.com/tutorial/qqer-ordem-3colunas.php), porém não consegui manter as colunas laterais fixas. Além disso, para alterar as colunas de lugar é necessário fazer contas, mexer com números, distância dos widths, etc. Não é complexo, mas considerei o código abaixo mais simples, pois basta alterar os floats conforme descrito abaixo. Deixo a referência do site a quem interessar. Motivo 3: Ainda no site do Maujor (https://www.maujor.com/layout3col.shtml) há esse exemplo que quase atendeu o meu problema, porém é muito complexo e a maneira que encontrei também considerei mais fácil (já utilizei muito esse esquema em projetos anteriores, porém complica na responsividade). Motivo 4: Principal referência que resolveu todos os meus problemas: https://www.richardbarros.com.br/css/css-truques-para-dominar-a-propriedade-float. Esse site foi a "Eureka" para eu deixar exatamente conforme eu queria. Segue o código: CSS: <style> #navGlobal { height:400px; } #navEsquerda { float:left; width:250px;/*Está em pixels, mas poderia deixar em porcentagem: ex: 20% */ background:#FFF; height:100%; } #navDireita { /*margin-left:var(--margemEsquerda); Opcional*/ word-break: break-all; word-wrap: break-word; height:100%; } #navLinks { float:right; width:200px;/*Está em pixels, mas poderia deixar em porcentagem: ex: 20% */ height:100%; background:#CCC; } #navConteudo { overflow:auto; height:100%; background:#EFEFEF; } </style> HTML: <div id="navGlobal"> <div id="navEsquerda">Menu</div> <div id="navDireita"> <div id="navLinks">Links</div> <div id="navConteudo">Conteúdo do meu site</div> </div> </div> Nos comentários do código, informei o que alterar para manter as colunas laterais fixas ou em porcentagem, bem como para trocá-las de lugar uma lateral com o outra. Deixei cores vibrantes como modelo para o usuário alterar depois. Abraços a todos(as).
  6. klonder

    Dúvida Programa de Login

    Eu acho que seu problema está mais relacionado com a linguagem backend (server side), do que com HTML propriamente dito, não?
  7. klonder

    Header com acento no TCPDF

    Para resolver acentos no tcpdf, no header e no footer, basta utilizar utf8_encode no texto. Também serve para o código html que retorna da variável. Ex: utf8_encode('<< MEU TÍTULO >>') Abaixo um exemplo para a função Footer, para permitir a palavra "Página" na frase "Página x de y". public function Footer() { $this->SetY(-15); $this->SetFont('helvetica', 'I', 8); $this->Cell(0, 10, utf8_encode('Página'). $this->getAliasNumPage() . ' de ' . $this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M'); } Se seu código HTML estiver dentro de uma variável do PHP, como por exemplo $html, basta aplicar a mesma rotina: $html = utf8_encode($html); $pdf->WriteHTMLCell(192,0,9,'',$html,0,1);
  8. klonder

    Criação de Bot para entrar em sites

    Eu já utilizei muito o AutoIt pra isso... só o captcha que atrapalha.
  9. klonder

    Video Aula

    Com o Camtasia você pode fazer tudo isso. Ele captura a tela e insere as setas. Faz várias outras coisas também.
  10. Desenvolvo em Java. Tenho sistema pronto para Gerenciamento de Home Care. Gera XML nos padrões TISS, tenho conhecimento de muita coisa relacionada a ANS, guias TISS, XML, XLS. Esse sistema gera prescrições, orçamentos, aditivos, etc. Poderia adaptar perfeitamente para clínicas. Ficaria show de bola! Caso queira uma demonstração: https://youtu.be/PJ3LAtjAmzk
  11. Tentei incluir a máscara a seguir em um POST meu antigo, porém está fechado para novas respostas: Todavia, para futuras consultas minhas e também para ajudar outras pessoas, venho deixar uma máscara interessante que acabei de terminar em JavaScript. Ficou muito menor que a do POST acima: <script type="text/javascript"> var iCount1; var trava = false; function MaskDown(e) { if (trava == false) { iCount1 = e.value.length; trava = true; } } function MaskUp(e,mascara) { if (trava) { var textoLimpo = e.value.substr(0,iCount1+1).replace(/[\/\:\-\.]/g,""); var texto = ""; var iM = 0; var iT = 0; while (iM < mascara.length) { if (iT < textoLimpo.length) { if (mascara.substr(iM,1) == "#") { texto += textoLimpo.substr(iT,1); iT++; } else { texto += mascara.substr(iM,1); } } iM++; } e.value = texto; trava = false; } } </script> Para funcionar, basta incluir em suas tags input os eventos, como demonstrado a seguir: <input type="text" id="tfData" onkeydown="MaskDown(this)" onkeyup="MaskUp(this,'##/##/####')" placeholder="dd/mm/aaaa" style="width:80px" /> <br /><input type="text" id="tfHora" onkeydown="MaskDown(this)" onkeyup="MaskUp(this,'##:##')" placeholder="hh:mm" style="width:50px"/> À medida que o usuário vai digitando, o valor campo vai sendo formatado. Pode ser usado para CPF, CEP, RG, dentre outros... Divirtam-se!
  12. klonder

    TreeTableView - Excluir várias linhas

    Fiz uma correção no código e esse problema foi corrigido (já corrigi no post acima). Ocorria em algumas situações dependendo da posição do ID. Agora o código acima está funcionando perfeitamente! Só que está funcionando do jeito que está... Eu gostaria de saber se seria possível fazer de outra forma, como: ol_OUTRASDESPESAS.RemoveAll(ol_T)
  13. Olá a todos! Pesquisei em vários locais, inclusive aqui no fórum, e não encontrei nenhuma resposta sobre a seguinte situação: Tenho um TreeTableView que carrega vários itens vindos do Banco de Dados. De acordo com a característica de cada item, eles são divididos em nós previamente especificados (são apenas estes nós pré-estabelecidos). Exemplo dos Nós: Materiais, Medicamentos, Taxas, Aluguéis... Em um determinado momento, preciso imprimir essa TreeTableView, excluindo algumas linhas que são desnecessárias. Quanto à impressão está tudo ok. Mas, para ganhar tempo, eu preciso excluir várias linhas de uma vez dessa TreeTableView, apertando o Shift e clicando/selecionando todas as linhas que deverão ser excluídas. Antes de postar o método que encontrei, vou detalhar como estou fazendo: Quando abro a TreeTableView, os dados originados do Banco de Dados são salvos em um ObservableList<itens> ol_OUTRASDESPESAS. Esse ObservableList é então processado e a TreeTableView é criada com cada item em seu nó específico. Preciso então imprimir essa TreeTableView, mas para isso, em alguns casos, preciso excluir várias linhas ao mesmo tempo. O que estou fazendo: Crio uma ObservableList transitória (ol_TEMP) com todas as linhas que estão selecionadas. Criei um laço for que percorre todos os itens da ol_OUTRASDESPESAS e um laço interno que percorre todos os itens da ol_TEMP. Dentro desses laços verifico se existe um ID dentro de ol_TEMP que seja igual ao id de ol_OUTRASDESPESAS. Se os IDs forem iguais, eu excluo o item de ol_OUTRASDESPESAS. private void excluirItem_OutrasDespesas() { ObservableList<TreeItem<objOutrasDespesas>> ol_T = FXCollections.observableArrayList(ttvOutrasDespesas.getSelectionModel().getSelectedItems()); //Percorrendo todos os itens do ol_OUTRASDESPESAS. Se o item atual estiver na lista de excluídos, excluir. for (int j = 0; j<ol_T.size(); j++) { for (int i = 0; i<ol_OUTRASDESPESAS.size(); i++) { if (Objects.equals(ol_OUTRASDESPESAS.get(i).getId(), ol_T.get(j).getValue().getId())) { //System.out.println("Removendo: "+ol_OUTRASDESPESAS.get(i).getItem()); ol_OUTRASDESPESAS.remove(i); } } } estruturaBasica(); } estrutura() é apenas uma chamada ao método para reconstruir a TreeTableView. Essa foi a maneira que encontrei para excluir os itens selecionados, porém não creio que seja a melhor. Sei que em Java existe o método removeAll, porém não consegui aplicar nesse caso. A minha dúvida é a seguinte: Existe outra opção melhor do que essa? Consigo evitar todos esses loops necessários para excluir todos os itens selecionados?
  14. klonder

    Por onde começar?

    O início é bem complicado. Eu não sabia absolutamente nada de nada! Não sabia como a coisa funcionava!!! Não sabia nem que era necessário um tal de NetBeans ou Eclipse para facilitar nossa vida! Resumindo: eu era uma anta! Como pode perceber, eu comecei do zero em Java! E olha que eu já tinha conhecimentos em JavaScript, PHP, ASP, HTML, CSS e MySQL! Java é diferente de tudo isso! Muitos dirão que a linguagem é semelhante, que é orientada a objetos... e um monte de coisa semelhante, mas pra mim tudo era diferente! Hoje estou quase com um projeto completo em JAVAFX, com relatórios em JasperReports maravilhosos! Cálculos e relatórios, com orçamentos, tudo ótimo! Mas até chegar a esse ponto, vi muitos vídeos no youtube! Muitos! Estudei as apostilas da Caelum e tive ajuda do Google. Pra quem é autodidata e não quer gastar, não tem outra maneira! É google, youtube e Caelum na veia!!! Se você puder gastar, compre um bom livro ou faça um curso (a base sem dúvida será melhor que a minha). Minha dica: Se você tiver tempo, eu sugiro, de verdade, aprender javascript primeiro. Você consegue fazer tudo com bloco de notas e ir testando de modo rápido! Assim que estiver bom nos algoritmos, pode passar para o java, aprender a conectar à base de dados, alterar elementos na tela, aplicar eventos, etc. O aprendizado deve ser diário. Em breve as coisas passarão a fazer sentido e você saberá o que fazer! Às vezes eu não sei exatamente o caminho, mas eu sei para onde devo ir, e isso fará parte de toda a sua vida de programador. Ninguém sabe tudo, você sempre fará pesquisas atrás de saídas para seus códigos!
  15. Olá a todos! Todos sabemos o quanto é difícil para o Java retornar, de modo fácil, a idade no formato: anos, meses e dias. Não estou me referindo a retornar o tempo entre duas datas em anos, o mesmo tempo em meses ou o mesmo em dias. Refiro-me a retornar quanto tempo uma determinada pessoa tem de vida, exemplo: 30 anos, 12 meses e 4 dias de vida. Sabemos ainda que existem os anos bissextos, o que complica o cálculo em algumas situações. O JAVA não nos ajuda de modo automático, como em alguma outra linguagem. Pensando nisso, desenvolvi um método que analisa as diversas situações e resolvi compartilhar, para outros colegas e para minhas consultas futuras. O método recebe como parâmetro uma data no formato yyyy-MM-dd (escolhi esse formato pois já vem do banco de dados) e retorna a idade no formato: 30a 4m 2d. JAVAFX: Retornar idade em anos, meses e dias: public String Idade(String dt_nasc) {//yyyy-MM-dd Calendar calHoje = GregorianCalendar.getInstance(); int diah = calHoje.get(Calendar.DAY_OF_MONTH); int mesh = calHoje.get(Calendar.MONTH) + 1; int anoh = calHoje.get(Calendar.YEAR); // Data do nascimento. String[] quebraDN = dt_nasc.split("-"); int dian = Integer.valueOf(quebraDN[2]); int mesn = Integer.valueOf(quebraDN[1]); int anon = Integer.valueOf(quebraDN[0]); String strNiver = anoh+"-"+mesn+"-"+dian; Calendar calNiver = Calendar.getInstance(); try { calNiver.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(strNiver)); } catch (ParseException ex) { Logger.getLogger(FormataData.class.getName()).log(Level.SEVERE, null, ex); } int anos = (calHoje.getTimeInMillis() < calNiver.getTimeInMillis())? (anoh-anon-1):anoh-anon ; int meses; int dias; meses = mesh - mesn; if (meses > 0) {//Verificando se já fez aniversário ou não if (diah < dian) { meses--; } } else if (meses < 0) {//Se o mês atual for menor que o mês do aniversário meses = 12 + meses;//Lembrar que meses está negativo, por isso a soma; //Da mesma forma, vamos comparar o dia atual com o dia do aniversário, para sabermos se o mês está completo ou não: if (diah < dian) { meses--; } } else {//Se o mês atual for o mês do aniversário: if (diah<dian) { meses = 11; } } dias = diah - dian; if (dias < 0) {//Se dia hoje menor que dia do niver, somar os dias desde o mês anterior: if (mesh==5||mesh==7||mesh==8||mesh==10||mesh==12) { dias = 30-dian+diah; } else if (mesh==1||mesh==2||mesh==4||mesh==6||mesh==9||mesh==11) { dias = 31-dian+diah; } else {//Verificando se o ano é bissexto ou não: Esse else é para o mês 3, cujo anterior é fevereiro: if (anoh%4 == 0) { dias = 29-dian+diah; } else { dias = 28-dian+diah; } } } System.out.println(anos+"a "+meses+"m "+dias+"d"); return anos+"a "+meses+"m "+dias+"d"; } Basta invocar o método através do evento de algum outro objeto, ou mesmo durante execução. Divirtam-se!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.