Como incorporar JButton em Graphics?

Estou tentando fazer um jogo… mas antes de realmente começar o jogo eu quero fazer um Menu do jogo com botoes(Jogar, Configurações), logo do jogo e talvez futuramente outras coisas. E no jogo eu quero fazer um botão para voltar ao Menu
O problema é que quando uso JButton ele não aparece, então eu não faço ideia de como implementar esses botões (nem a parte estética, nem a parte logica :sweat:), segue o código simplificado:

public class Main{
    public static void main(String[] args){
        JFrame janela = new JFrame();
        Jogo jogo = new Jogo();
        Menu menu = new Menu();
        janela.add(menu);
        // configuraçoes tamanho titulo 
        
    }
}
public class Jogo extends JPanel{
    public Jogo(){
        super("Joguinzin manero");
        JButton botao = new JButton("Voltar ao menu");
        add(botao);// isso aqui funciona mas o botao fica por baixo do Graphics
    }
    @Override 
    public void paint(Graphics g){
        Graphics2D grafico = (Graphics2D) g;
        // desenha o jogo todo
        grafico.dispose();
    }
}

Pra ser mais específico e direto segue as duvidas:
Como fazer um Botao de menu e de voltar ao menu?
Como personalizar esse botao(mudar o style dele, quando passar o mouse por cima, ou realmente clicar nele, nao quero um botao padrão)?

Você não colocou a parte onde cria o botão e o adiciona em um JFrame, então fica difícil saber como te ajudar.

Você provavelmente precisa estudar um pouco mais sobre Swing antes de ir mais a fundo nesse projeto. Recomendo a leitura:

No Ponto V, tem vários artigos sobres jogos e mais sobre Java2D: http://www.pontov.com.br/site/index.php/java/48-java2d

Para personalizar um JButton, você pode alterar as propriedades dele, como cor, adicionar uma imagem, bordas, etc. Você também pode estender a classe JButton, criando um botão mais personalizado, que poderá ser reusado com mais facilidade.

Outra opção, talves mais coerente com jogos, criar um botão usando formas geométricas simples (como retângulos) e desenhá-los diretamente com Java2D (no método paintComponent do JPanel, que você estendeu no seu exemplo).

Não tem muito atalho. Tem que estudar um bocado pra entender como essas funcionam para chegar onde você quer.

Abraço.

1 curtida

Obrigado pelas dicas meu caro, vou ler esses artigos e arrumar o código de demonstração ali… mas acho q não fui tao claro, o meu problema é que quando eu adiciono o meu botão ele não reage bem ao método paintComponent… fica por baixo do que ele pintou no frame, inacessível. Quanto a lógica por trás da navegação entre as cenas(menu, jogo em si e futuramente escolha do personagem) tenho duvidas também… Fazer o botão diretamente no paintConponent já era uma opção mas eu preferi deixar em ultimo caso.
Eu já vi o PontoV, me ajudou bastante, mas não fala nada sobre um botão no por cima do Graphics, inclusive foi de lá q eu vim… O viniGodoy é um dos moderadores desse site aqui, já sou fã…
Obrigado pela ajuda <3

Como disse, sem saber o que você tentou fazer, fica difícil saber o que está causando esse problema no seu código.

Veja um exemplo de JFrame com um JPanel personalizado com um botão:

Classe do JPanel

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Graphics2D.*;
import java.awt.geom.*;
import java.awt.Color;
import javax.swing.*;

public class PainelJogo extends JPanel{
	
	Rectangle2D r = new Rectangle2D.Float(10, 10, 100, 200);

	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		Graphics2D g2 = (Graphics2D) g.create();
		
		g2.setPaint( Color.BLUE );
		
		g2.draw(r);
				
		g2.dispose();
	}
}

Classe do JFrame:

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.*;

public class TestePaint extends JFrame{
	
	PainelJogo painel = new PainelJogo();
	JButton botao = new JButton("Clique em mim");

	public TestePaint(){
		super("Janela com botao e paintComponent num JPanel");
		setSize(500,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		setLayout(new BorderLayout());
		
		getContentPane().add(painel, BorderLayout.CENTER);
		
		painel.setLayout(new BorderLayout());
	
		botao.setBackground(Color.GREEN);
		
		painel.add(botao, BorderLayout.SOUTH);
		
		botao.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				JOptionPane.showMessageDialog(null, "Fui clicado!");
			}
		});
	}
	
	public static void main(String[] args){
		final TestePaint janela = new TestePaint();
	
		java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                janela.setVisible(true);
            }
        });
	
	}
}

Você realmente precisa dar uma estudada em como funciona o Java Swing para entender como algumas coisas funcionam, por isso foquei em citar esses materiais.

Abraço.

1 curtida

Vc é um deus… vlw msm <3
Vou ter q estudar bastante mesmo. Java é muito grande