Eu tenho um JFrame com uma imagem de fundo e um JButton por cima, como faço o JButton ficar transparente e só deixar o texto dele?
Estou procurando na documentação do Jbutton mais não encontro ate o momento não encontrei nada para deixar apenas o botão invisível deixando só o texto aparecendo, já pensou em usar um Jlabel pra isso?
Só que eu preciso clicar, como vou clicar num label? ‘-’
Na ide que eu utilizo NetBeans, existe um Evento chamado mouseClicked
Documentação das classes:
https://docs.oracle.com/javase/8/docs/api/
meuObjetoJButton.setOpaque(false);
btnJogar.setOpaque(false);
Simplesmente não aconteceu nada ‘-’
E como deixo o label transparente?
O container pai também precisa estar sem opacidade para você perceber diferença.
JLabel também tem o método setOpaque.
Se quiser forçar mais ainda a barra:
button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
Ainda não ficou transparente, mas ficou todo esbranquiçado.
Olha como está:
package br.paulo.damas.gui;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Menu extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private String imgMenu = "/br/paulo/damas/res/backgroundMenu.png";
private int x = 0;
private int y = 0;
private JButton btnJogar;
public Menu() {
this.setTitle("Damas");
this.setSize(400,400);
this.setLocationRelativeTo(null);
this.setLayout(null);
btnJogar = new JButton("Jogar");
btnJogar.setBounds(0,0,100,30);
btnJogar.setOpaque(false);
btnJogar.setContentAreaFilled(false);
btnJogar.setBorderPainted(false);
btnJogar.addActionListener(this);
JPanel pn = new JPanel();
pn.setLayout(new GridLayout(1,1));
pn.setBounds(80,35,235,45);
pn.add(btnJogar);
this.add(pn);
this.setVisible(true);
this.setResizable(false);
this.setDefaultCloseOperation(3);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnJogar) {
JOptionPane.showMessageDialog(null, "t");
}
}
@Override
public void paint(Graphics g) {
try {
BufferedImage buffer = ImageIO.read(getClass().getResource(imgMenu));
super.paintComponents(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(buffer,x,y,400,400, this);
g.dispose();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Testei este método antes de responder,mais não deu certo, pra isso é precisar deixar o Jframe opaco também?
Você não quer deixar opaco, quer deixar transparente.
Você está com problema devido à forma como sobrescreveu o método paint(Graphics)
do JFrame
.
Não sobrescreva o paint(Graphics)
do JFrame
.
Ao invés disso, crie o seu próprio ImagePanel
que aceite uma imagem de fundo e sobrescreva somente o método paintComponent(Graphics)
, veja:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
* Painel que aceita uma imagem de fundo
*/
public class ImagePanel extends JPanel {
private static final long serialVersionUID = 1L;
private final BufferedImage imagem;
public ImagePanel(String resource) {
BufferedImage buffer = null;
try {
buffer = ImageIO.read(getClass().getResourceAsStream(resource));
} catch (Exception e) {
e.printStackTrace();
}
imagem = buffer;
}
@Override
protected void paintComponent(Graphics g) {
Dimension size = getSize();
g.drawImage(imagem, 0, 0, size.width, size.height, this);
}
}
Agora utilize este ImagePanel
no seu JFrame
, veja:
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Menu extends JFrame {
private static final long serialVersionUID = 1L;
private String imgMenu = "/br/paulo/damas/res/backgroundMenu.png";
private JButton btnJogar;
public Menu() {
// utilize como container um painel próprio para renderizar uma imagem de fundo
ImagePanel imagePanel = new ImagePanel(imgMenu);
this.setContentPane(imagePanel);
this.setTitle("Damas");
this.setSize(400, 400);
this.setLocationRelativeTo(null);
this.setLayout(null);
btnJogar = new JButton("Jogar");
btnJogar.setBounds(0, 0, 100, 30);
btnJogar.setOpaque(false);
btnJogar.setContentAreaFilled(false);
btnJogar.setBorderPainted(false);
btnJogar.addActionListener(event -> pressionouBtnJogar());
JPanel painel = new JPanel();
painel.setOpaque(false); // o container do botão também tem que ser transparente
painel.setLayout(new GridLayout(1, 1));
painel.setBounds(80, 35, 235, 45);
painel.add(btnJogar);
this.add(painel);
this.setVisible(true);
this.setResizable(false);
this.setDefaultCloseOperation(3);
}
private void pressionouBtnJogar() {
JOptionPane.showMessageDialog(null, "t");
}
}
Funcionou direitinho vlw