问题描述
我有两个JPanels,一个是图像,另一个是表单.我正在尝试将带有背景图像的第一个面板放在其他面板(绘画)之后,但是它不起作用
I got two JPanels, one is an image an other a form. I'm trying to put the first panel with the background image behind other (painting) but it doesn't work
面板背景:
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;
}
这是面板形式(仅遵循逻辑):
and this is the panel form (only to follow the logic):
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()也可见.有什么想法可以给我带来启发吗?
I try other ways, and what i just get is the background image overlapping everything, even the painelCadastro() being visible..Any ideas to give me a light?
编辑
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());
好吧,我创建了一个辅助类,将她的图像添加到面板中,将内容设置为框架,但是当我尝试将表单可见时,仍然是另一个或另一个
alright, i creat a secondary class, add the imagem from her to a panel, set the content to frame, but when i try to turn the form visible still one or other
编辑有效,谢谢
但是... 此"xp界面"中的复选框菜单在哪里?另一个问题是标签"吗?出现在gui的末尾我猜这可能是Dimension错误,因为框架是.pack
推荐答案
因此,我正在尝试编写您的代码的正面和反面...
So, I'm trying to make heads and tails of your code...
首先我们有...
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
的面板!?
which on surface looks okay, but when we take a closer look at I notice that the panel which is been returned from the method IS NOT the panel which is been applied as the contentPane
!?
但是在您的criarGUI
中,您将使用fundo
方法返回的面板并将其添加到另一个框架中……但是您只是在该框架中添加了一个空白面板.
But in your criarGUI
you take the panel returned by the fundo
method and add it to another frame ... but you're just adding a blank panel to the frame.
所以出于某种原因,您要从demo
类中获取内容,然后尝试将其添加到其他框架中...为什么这个问题应该真正回答,因为这令人担忧...
So for some reason you're taking content from the demo
class and trying to add it to a different frame...why is a question that should really be answered, because that's kind of worrying...
另一个问题是,您不断拨打painelCadastro
...
Another problem is, you keep calling painelCadastro
...
demo.painelCadastro().setOpaque(false);
frame.add(demo.painelCadastro());
,但是每次调用painelCadastro
都会创建一个新的JPanel
,因此更改其opaque
状态无效.作为第二次调用它,您将获得JPanel
的全新实例.
but painelCadastro
creates a new JPanel
each time you call it, so changing its opaque
state has no effect, as the second time you call it, you're getting a brand new instance of JPanel
解决方案??让您的方法缓存其操作的结果(又称延迟加载),并始终返回相同的JPanel
实例(最初创建的实例)或维护对返回的组件的引用.另外,请确保您适当地命名方法,以使它们对它们的作用有更多的了解.在您的情况下,makePainelCadastro
或createPainelCadastro
可能更合适
The solution?? Either have your methods cache the result (AKA lazy loading) of their operations and always return the same instance of JPanel
(which the initially created) or maintain a reference to the component which is returned. Also, make sure you name your methods appropriately so they give more of an idea of what they do. In your case makePainelCadastro
or createPainelCadastro
might be more appropriate
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);
}
}
}
这篇关于JPanel图像背景与其他JPanel重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!