首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPanel图像背景重叠其他JPanel

JPanel图像背景重叠其他JPanel
EN

Stack Overflow用户
提问于 2016-02-17 18:25:55
回答 2查看 589关注 0票数 0

我有两个JPanels,一个是图像,另一个是表单。我正试着把第一个带有背景图像的面板放在其他(绘画)后面,但它不起作用

小组背景:

代码语言:javascript
复制
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;
}

这是面板形式(只遵循逻辑):

代码语言:javascript
复制
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;
}

我用这个密码给他打电话:

代码语言:javascript
复制
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()是可见的。有什么办法给我点光吗?

编辑

代码语言:javascript
复制
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");
    }
}

在主课上:

代码语言:javascript
复制
    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());

好的,我创建了一个二级类,将她的图像添加到面板中,将内容设置为框架,但是当我试图将表单变为可见的时,仍然是一个或另一个。

编辑工作,谢谢

但是..。http://i.stack.imgur.com/GpMIz.png

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-17 21:49:29

所以,我试着把你的代码搞清楚.

首先我们有..。

代码语言:javascript
复制
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类获取内容,并试图将其添加到不同的frame...why中,这是一个真正需要回答的问题,因为这有点令人担忧…

另一个问题是你一直打电话给painelCadastro..。

代码语言:javascript
复制
demo.painelCadastro().setOpaque(false);
frame.add(demo.painelCadastro());

但是painelCadastro每次调用它时都会创建一个新的JPanel,因此更改它的opaque状态没有任何影响,就像第二次调用它一样,您将得到一个全新的JPanel实例。

解决办法??要么让您的方法缓存其操作的结果(AKA延迟加载),然后始终返回相同的JPanel实例(最初创建的实例),要么保持对返回的组件的引用。此外,请确保您将方法命名为适当的名称,以便让它们更好地了解它们所做的事情。在您的例子中,makePainelCadastrocreatePainelCadastro可能更合适。

代码语言:javascript
复制
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);
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-02-17 19:18:55

不能向内容窗格的中心添加多个组件。您需要在组件之间建立父/子关系。

基本的逻辑应该是:

代码语言:javascript
复制
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 );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35464737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档