【发布时间】:2016-02-19 00:29:51
【问题描述】:
我有两个 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());
好吧,我创建了一个辅助类,将她的图像添加到面板中,将内容设置为框架,但是当我尝试将表单变为可见时仍然是一个或另一个
编辑 它有效,谢谢
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。
-
调用 super.paintComponent 也是个好主意
-
@MadProgrammer 我用二级课程编辑它,但仍然不起作用
-
考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
-
你的代码有点奇怪,你似乎在使用
fundo为JFrame创建背景图像(使用setContentPane),但随后你将其添加到另一个框架中在criarGUI?!但是从fundo返回的组件实际上并不是设置contentPane时使用的组件!??!
标签: java swing user-interface jpanel overlapping