Fonte do artigo: Entusiasta da Computação Autor: Zhang Jian
Você ainda se lembra do Minicooper que atravessava o trânsito de Hollywood como um elfo em “O Último Dia”? Mark Wahlberg e Sally Theron conduziram-no para transportar ouro no valor de dezenas de milhões debaixo do nariz dos seus inimigos. No entanto, se uma carroceria de Minicooper que não pode correr rapidamente fosse colocada na sua frente agora, o que você pensaria nisso? Ainda é o elfo errante? Hoje vamos montar as peças deste Minicooper peça por peça e deixá-lo funcionar.
Prefácio
A partir desta edição, fornecemos o código-fonte completo do jogo (clique para fazer o download). Java Cafe defende que todos prestem igual atenção à teoria e à prática. Apresentaremos as principais tecnologias e ideias de implementação na série. Os amigos podem ler o código-fonte em conjunto com o artigo, como ler um jornal e tomar café ao mesmo tempo. tempo. É aqui que a fragrância de Didi não se esgota.
layout do jogo
"Lianliankan" é um jogo de xadrez bidimensional. Se você deseja criar um jogo de xadrez, GridLayout deve ser a melhor escolha. Agora vamos dar uma olhada no construtor do GridLayout:
・GridLayout(): Por padrão, a área de layout é dividida em tamanho 1*1
・GridLayout(int rows, int cols): Especifica o número de grades horizontais e verticais na área de layout
・GridLayout(int rows, int cols, int hgap, int vgap): O mesmo que acima, e também especifica o espaçamento horizontal hgap e o espaçamento vertical vgap entre cada grade
Não deixe que esses três construtores o assustem. Na verdade, contanto que você goste, você pode usar qualquer um deles com confiança. Mesmo se acidentalmente usar o "errado", há maneiras de ajustá-lo no futuro. A única coisa a notar é que ao adicionar controles ao GridLayout, a ordem padrão é do canto superior esquerdo para o canto inferior direito.
Agora vamos determinar o número de grades do jogo. Quantas grades são apropriadas? Muito pouco tornará o jogo menos difícil, muito pouco causará impacto visual. Portanto, devemos expressá-lo através de um par de constantes. Mesmo que queiramos modificá-lo no futuro, será muito fácil.
Em Java, a definição de constantes precisa ser escrita na forma de estática final pública. Se estipularmos que o tabuleiro do jogo tem 8 grades horizontalmente e 8 grades verticalmente, então devemos defini-lo assim:
público final estático int ROW = 8;
público final estático int COLUMN = 8;
Em seguida, usamos o segundo construtor do GridLayout para criar o layout:
GridLayout gridLayout = new GridLayout(LINHA, COLUNA);
Por fim, também precisamos alterar o layout da área do jogo (contentPanel) para o layout acima:
contentPanel.setLayout(gridLayout);
Se você compilar e executar o programa neste momento, poderá estar se perguntando: Por que não houve alteração na interface? Há algo errado? Embora tenhamos especificado o layout, nenhum controle foi adicionado, então é claro que nenhuma alteração pode ser vista. Agora vamos adicionar botões ao layout:
for (int i = 0; i < LINHA * COLUNA; i++) {
botão JButton = new JButton("Kyodai");
contentPanel.add(botão);
}
Tente executar o programa novamente. É igual ao meu (veja a Figura 1)?
Uso inteligente de JButton para fazer barulho
JButton é um controle de botão. Também é um controle extremamente comum no Swing. No entanto, ainda precisamos despender um pouco de esforço para entendê-lo e usá-lo, porque quando você for capaz de usar o JButton com proficiência, encontrará outros controles do Swing. também tão semelhante.
Se você executar o programa que acabou de escrever, descobrirá que os botões da área de jogo estão sempre cheios, o que é muito inconveniente para a operação real do jogo. Portanto, temos que encontrar uma maneira de liberar algumas grades. O layout do GridLayout é bom, mas você não pode pular uma determinada grade ao adicionar controles.
Na verdade, isso não é difícil. Como o GridLayout não permite saltos, se integrarmos os controles adicionados em uma determinada grade com o fundo do layout do GridLayout, obteremos um efeito visual consistente. Além disso, se alguém clicar acidentalmente nesta grade, o botão ainda ficará exposto. Temos que encontrar uma maneira de evitar que o botão seja clicado, o que requer o uso do método setEnabled() do JButton. Por fim, para botões clicáveis, quando são clicados, temos que distinguir qual botão foi clicado.
Quando implementamos a função "Sobre" da última vez, usamos o método e.getSource() para determinar a origem do evento de clique do mouse. No entanto, isso só foi eficaz para controles nomeados. Aqui, usar um array para representar botões é sem dúvida a melhor maneira. Primeiro, vamos modificar o código acima:
JButton[] pontos = novo JButton[ROW * COLUMN];
for (int i = 0; i < LINHA * COLUNA; i++) {
pontos[i] = new JButton("Kyodai");
pontos[i].setActionCommand("" + i);
contentPanel.add(pontos[i]);
pontos[i].addActionListener(este);
}
Não se esqueça de escrever dots[i] = new JButton("Kyodai") no corpo do loop. Embora o número do grupo de pontos tenha sido definido e usado anteriormente, isso apenas informa ao programa que precisamos usar alguns JButtons, mas, estes. JButtons ainda não foram inicializados. Ao mesmo tempo, não usamos apenas setActionCommand() para especificar nomes de eventos para botões, mas também usamos o método addActionListener() para adicionar processamento de resposta de evento a cada botão.
Em relação ao código de resposta do evento, podemos adicioná-lo após o código do evento actionPerformed() original:
if (e.getSource() instância do JButton) {
Botão JButton = (JButton) e.getSource();
deslocamento interno = Integer.parseInt(button.getActionCommand());
linha interna, coluna;
linha = Math.round(deslocamento/COLUNA);
col = deslocamento - linha * COLUNA;
JOptionPane.showMessageDialog(this, "ROW="+linha+", COL="
+ col, "Botão", JOptionPane.INFORMATION_MESSAGE);
}
No código acima, e.getSource() instanceof JButton é usado para determinar se o evento gerado é gerado por um controle do tipo JButton e, em seguida, executa a conversão forçada de classe no controle que gera a fonte do evento e, em seguida, usa Integer.parseInt( botão O método .getActionCommand()) converte o nome do evento obtido em um número inteiro e o código a seguir restaura esse número inteiro para informações de linha e coluna.
Ok, agora execute o programa e clique em cada botão para ver se uma caixa de diálogo como a da direita aparecerá?
Observe que nossos subscritos começam em 0. O código-fonte do programa desta edição (clique para baixar).
Usando imagens no Swing
Atualmente, resolvemos o problema de operação do usuário. Para deixar a interface bonita, precisamos usar imagens em vez de texto. Amigos que têm tempo e paciência podem fazer fotos personalizadas sozinhos, mas tome cuidado para manter o tamanho de cada foto consistente, caso contrário ficará muito feio. Se quiser evitar problemas, você também pode usar diretamente as imagens fornecidas no pacote de download.
No Swing, você pode usar o método setIcon(Image image) para definir uma imagem para um JButton. O parâmetro image é o objeto de imagem que queremos definir.
・Use a classe Toolkit para obter:
imagem = Toolkit.getDefaultToolkit().getImage(url);
・Use o método getImage() da classe ImageIcon para obter:
imagem = new ImageIcon(getClass().getResource(nome do arquivo)).getImage();
Escolhemos o primeiro método aqui. Para facilitar a obtenção do objeto Imagem novamente no futuro, podemos escrever isso como uma função:
Imagem getImage(String nome do arquivo){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL url=nulo;
Imagem imagem = nulo;
url = urlLoader.findResource(nomedoarquivo);
imagem = Toolkit.getDefaultToolkit().getImage(url);
imagem de retorno;
}
Com essa função será muito mais prático usar imagens no futuro, não é?
Agora que a imagem está disponível, podemos expressar as informações do mapa em Map.Java no pacote de código-fonte na forma de uma imagem. Como este código é sobre o código do algoritmo do jogo, não vou mais listar o código. Vamos explicar brevemente como isso é feito aqui! No Map.Java, usamos um array bidimensional map[][] para salvar as informações da imagem. Ao mesmo tempo, também usamos um array unidimensional images[] para salvar cada objeto de imagem. um valor. Este valor não indica apenas o valor correspondente ao botão na interface do jogo, mas também indica o número da imagem no array images[] usado por este botão. A interface de execução do programa ficará muito mais bonita.
resumo
Hoje apresentamos o controle JButton no Swing. Para a maioria dos controles Swing, o uso do JButton pode ser copiado. Não subestime este JButton. Quando você conseguir dominá-lo bem, suas habilidades de Swing terão melhorado para um nível superior. Além disso, também aprendemos dois métodos de carregamento de arquivos de imagem em Java. Finalmente, combinamos as duas partes acima para criar uma bela interface de jogo. Embora eu não tenha escrito o código completo aqui, acredito que todos conseguirão atingir o objetivo consultando meu programa fonte e por meio de seus próprios esforços. Se você encontrar um problema que não pode ser resolvido, entre em contato comigo através de [email protected].
Não sei se você está satisfeito com o conteúdo de hoje? A emoção ainda está por vir, todos devem continuar a frequentar o nosso café!