我有两个JPanel,一个是另一个形式的图像。我试图把第一个带有背景图像的面板放在其他面板上(绘画),但它不起作用
小组背景:
public JPanel fundo() {
JPanel bg = new JPanel(new BorderLayout());
try {
Image backgroundImage = ImageIO.read(new File("C:/ceu.png"));
setContentPane(new JPanel(new BorderLayout()) {
@Override
public void paintComponent(Graphics g) {
g.drawImage(backgroundImage, 0, 0, null);
}
});
} catch (IOException e) {
System.out.println(e);
}
return bg;
}
这是面板形式(仅遵循逻辑):
public JPanel painelCadastro() {
JPanel telaAtual = new JPanel();
JTextField nome, telefone, aniversario, email;
String definicao;
JLabel lugarnome, lugartelefone, lugaraniversario, lugaremail;
JTextArea endereço;
telaAtual.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//c.anchor = GridBagConstraints.WEST;
//c.ipadx = 2;
//c.ipady = 3;
//c.gridheight = GridBagConstraints.REMAINDER;
//c.gridwidth = GridBagConstraints.REMAINDER;
lugarnome = new JLabel("Nome");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridwidth = 1; //tamanho do compontente em celulas HORIZONTAL
c.gridheight = 1; //tamanho do compontente em celulas VERTICAL
c.gridx = 0; //localização da celula na coluna
c.gridy = 0; //localização da celula na linha
//c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(10, 10, 0, 0);
telaAtual.add(lugarnome, c);
nome = new JTextField("Digite seu nome aqui");
definicao = "nome";
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridwidth = 7; //tamanho do compontente em celulas HORIZONTAL
c.gridx = 1; //localização da celula na linha
c.gridy = 0; //localização da celula na coluna
//c.fill = GridBagConstraints.HORIZONTAL;
limpaCaixaTexto(nome, definicao);
telaAtual.add(nome, c);
lugartelefone = new JLabel("Telefone");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 1; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugartelefone, c);
telefone = new JTextField("Digite seu telefone aqui");
definicao = "telefone";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 1; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
limpaCaixaTexto(telefone, definicao);
telaAtual.add(telefone, c);
lugaremail = new JLabel("Email");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 2; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugaremail, c);
email = new JTextField("Digite seu e-mail aqui");
definicao = "e-mail";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 2; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
limpaCaixaTexto(email, definicao);
telaAtual.add(email, c);
//--------- INICIO CAMPO DATA -------------
lugaraniversario = new JLabel("Data de Nascimento");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 3; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugaraniversario, c);
//JFormattedTextField dataAniversario = new JFormattedTextField(DateFormat.getDateInstance(DateFormat.MEDIUM));
//GregorianCalendar data = new GregorianCalendar();
//dataAniversario.setText(data.get(Calendar.DAY_OF_MONTH) + "/" + (data.get(Calendar.MONTH) + 1) + "/" + (data.get(Calendar.YEAR)));
DateFormat df = new SimpleDateFormat("dd/mm/yyyy");
JFormattedTextField dataAniversario = new JFormattedTextField(df);
try {
MaskFormatter dateMask = new MaskFormatter("##/##/####");
dateMask.install(dataAniversario);
} catch (ParseException ex) {
Logger.getLogger(TelaPrincipalLocadora.class
.getName()).log(Level.SEVERE, null, ex);
}
definicao = "aniversario";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 3; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
limpaCaixaTexto(dataAniversario, definicao);
telaAtual.add(dataAniversario, c);
//--------- FIM CAMPO DATA -------------
return telaAtual;
}
我用这段代码打电话给他:
private static void criarGUI() throws IOException {
//Create and set up the window.
JFrame frame = new JFrame("Vapstor Locadoras V1.0");
frame.setSize(590, 456);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setLayout(new BorderLayout());
TelaPrincipalLocadora demo = new TelaPrincipalLocadora();
frame.setJMenuBar(demo.BarradeMenu());
demo.painelCadastro().setVisible(false);
frame.add(demo.painelCadastro()); //~HERE HE ADD
frame.add(demo.fundo());
System.out.println(demo.painelCadastro().isVisible()); // returns true
demo.fundo().setOpaque(false); //HERE
frame.add(demo.fundo()); //AND HERE i guess is the problem
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
我尝试其他方式,我得到的是背景图像重叠一切,甚至painelCadastro()是可见的.. 有什么想法给我一个亮点吗?
修改的
static class Background extends JComponent {
Image backgroundImage;
public Background() throws IOException {
this.backgroundImage = ImageIO.read(new File("C:/ceu.png"));
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(backgroundImage, 0, 0, this);
System.out.println("pintou o 7");
}
}
主要课程:
JPanel tela = new JPanel(new BorderLayout());
tela.add(new Background());
tela.setOpaque(false);
frame.setContentPane(tela);
//frame.setAlwaysOnTop(true);
demo.painelCadastro().setOpaque(false);
frame.add(demo.painelCadastro());
好吧,我创建了一个二级课程,将她的imagem添加到一个面板,将内容设置为框架,但是当我尝试将表单显示为仍然是一个或其他
修改 它有效,gracias
答案 0 :(得分:3)
所以,我试图为你的代码做好准备......
首先我们有......
public JPanel fundo() {
JPanel bg = new JPanel(new BorderLayout());
try {
Image backgroundImage = ImageIO.read(new File("C:/ceu.png"));
setContentPane(new JPanel(new BorderLayout()) {
@Override
public void paintComponent(Graphics g) {
g.drawImage(backgroundImage, 0, 0, null);
}
});
} catch (IOException e) {
System.out.println(e);
}
return bg;
}
表面上看起来还不错,但是当我们仔细观察时,我注意到从方法返回的面板不是作为contentPane
应用的面板!?
但是在你的criarGUI
中,您可以使用fundo
方法返回的面板并将其添加到另一个框架中......但您只需在框架中添加一个空白面板。
因此,出于某种原因,您需要从demo
课程中获取内容并尝试将其添加到不同的框架中...为什么这个问题应该得到真正的回答,因为这样做了有点担心......
另一个问题是,你一直在呼叫painelCadastro
......
demo.painelCadastro().setOpaque(false);
frame.add(demo.painelCadastro());
但painelCadastro
每次调用时都会创建一个新的JPanel
,因此更改其opaque
状态无效,因为第二次调用它时,您将获得JPanel
解决方案??要么让您的方法缓存其操作的结果(AKA延迟加载),并始终返回JPanel
(最初创建的)的相同实例,要么维护对返回的组件的引用。此外,请确保您正确地命名您的方法,以便他们更好地了解他们的工作。在您的情况下,makePainelCadastro
或createPainelCadastro
可能更合适
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.imageio.ImageIO;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.MaskFormatter;
public class Testing {
public static void main(String[] args) {
new Testing();
}
public Testing() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new Background());
JPanel painelCadastro = painelCadastro();
painelCadastro.setOpaque(false);
frame.add(painelCadastro);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public JPanel painelCadastro() {
JPanel telaAtual = new JPanel();
JTextField nome, telefone, aniversario, email;
String definicao;
JLabel lugarnome, lugartelefone, lugaraniversario, lugaremail;
JTextArea endereço;
telaAtual.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//c.anchor = GridBagConstraints.WEST;
//c.ipadx = 2;
//c.ipady = 3;
//c.gridheight = GridBagConstraints.REMAINDER;
//c.gridwidth = GridBagConstraints.REMAINDER;
lugarnome = new JLabel("Nome");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridwidth = 1; //tamanho do compontente em celulas HORIZONTAL
c.gridheight = 1; //tamanho do compontente em celulas VERTICAL
c.gridx = 0; //localização da celula na coluna
c.gridy = 0; //localização da celula na linha
//c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(10, 10, 0, 0);
telaAtual.add(lugarnome, c);
nome = new JTextField("Digite seu nome aqui");
definicao = "nome";
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridwidth = 7; //tamanho do compontente em celulas HORIZONTAL
c.gridx = 1; //localização da celula na linha
c.gridy = 0; //localização da celula na coluna
//c.fill = GridBagConstraints.HORIZONTAL;
// limpaCaixaTexto(nome, definicao);
telaAtual.add(nome, c);
lugartelefone = new JLabel("Telefone");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 1; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugartelefone, c);
telefone = new JTextField("Digite seu telefone aqui");
definicao = "telefone";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 1; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
// limpaCaixaTexto(telefone, definicao);
telaAtual.add(telefone, c);
lugaremail = new JLabel("Email");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 2; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugaremail, c);
email = new JTextField("Digite seu e-mail aqui");
definicao = "e-mail";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 2; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
// limpaCaixaTexto(email, definicao);
telaAtual.add(email, c);
//--------- INICIO CAMPO DATA -------------
lugaraniversario = new JLabel("Data de Nascimento");
c.weightx = 1; // percentual de tamanho em relação aos demais
c.gridx = 0; //localização da celula na linha
c.gridy = 3; //localização da celula na coluna
c.fill = GridBagConstraints.NONE;
telaAtual.add(lugaraniversario, c);
//JFormattedTextField dataAniversario = new JFormattedTextField(DateFormat.getDateInstance(DateFormat.MEDIUM));
//GregorianCalendar data = new GregorianCalendar();
//dataAniversario.setText(data.get(Calendar.DAY_OF_MONTH) + "/" + (data.get(Calendar.MONTH) + 1) + "/" + (data.get(Calendar.YEAR)));
DateFormat df = new SimpleDateFormat("dd/mm/yyyy");
JFormattedTextField dataAniversario = new JFormattedTextField(df);
try {
MaskFormatter dateMask = new MaskFormatter("##/##/####");
dateMask.install(dataAniversario);
} catch (ParseException ex) {
ex.printStackTrace();
}
definicao = "aniversario";
c.weightx = 2; // percentual de tamanho em relação aos demais
c.gridx = 1; //localização da celula na linha
c.gridy = 3; //localização da celula na coluna
c.fill = GridBagConstraints.HORIZONTAL;
// limpaCaixaTexto(dataAniversario, definicao);
telaAtual.add(dataAniversario, c);
//--------- FIM CAMPO DATA -------------
return telaAtual;
}
public class Background extends JPanel {
private BufferedImage backgroundImage;
public Background() throws IOException {
this.backgroundImage = ImageIO.read(new File("..."));
setLayout(new BorderLayout());
}
@Override
public Dimension getPreferredSize() {
return backgroundImage == null ? new Dimension(200, 200) : new Dimension(backgroundImage.getWidth(), backgroundImage.getHeight());
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, this);
}
}
}
答案 1 :(得分:2)
您无法将多个组件添加到内容窗格的CENTER。您需要在组件之间建立父/子关系。
基本逻辑应该是:
JPanel background = new BackgroundPanel(); // this is where you paint the image
background.setLayout( new BorderLayout() );
JPanel child = new JPanel(); // this is the panel with your other components
child.setOpaque( false );
background.add( child );
frame.add( background );