Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 停止缩放JPanel的背景图像_Java_Swing - Fatal编程技术网

Java 停止缩放JPanel的背景图像

Java 停止缩放JPanel的背景图像,java,swing,Java,Swing,编辑1: MigLayout的jar是: 作品: 我有一个JPanel作为Java Swing应用程序的主屏幕。它无法调整大小。在这个主屏幕中,我有一些按钮可以引导用户使用应用程序的不同功能/部分,每个功能都在不同的JPanel中。我使用CardLayout组织这些面板,将它们放在JPanel panelCentro中,并将此面板添加到主屏幕的contentPane中 在主框架中: panelCentro.setLayout(new CardLayout()); //getContentPane

编辑1:

MigLayout的jar是:

作品:

我有一个JPanel作为Java Swing应用程序的主屏幕。它无法调整大小。在这个主屏幕中,我有一些按钮可以引导用户使用应用程序的不同功能/部分,每个功能都在不同的JPanel中。我使用CardLayout组织这些面板,将它们放在JPanel panelCentro中,并将此面板添加到主屏幕的contentPane中

在主框架中:

panelCentro.setLayout(new CardLayout());
//getContentPane().setLayout(null);
getContentPane().add(panelCentro);
panelCentro有一个背景图像。我覆盖此面板的paintComponent方法来绘制图像

只有当我在panelCentro中使用null作为布局管理器时,所有这些都可以正常工作。问题在于功能面板应该接受大小调整

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

import net.miginfocom.swing.MigLayout;

public class AutoResizingProblem extends JFrame {

    private static final Font ARIAL_PLAIN_15 = new Font("Arial", Font.PLAIN, 15);
    private static final Font ARIAL_BOLD_14 = new Font("Arial", Font.BOLD, 14); //FONT++
    private static final Font ARIAL_PLAIN_14 = new Font("Arial", Font.PLAIN, 14); //font++
    private static final Font CONSOLAS_PLAIN_14 = new Font("Consolas", Font.PLAIN, 14); //FONT++
    private static final Font ARIAL_PLAIN_13 = new Font("Arial", Font.PLAIN, 13);//font++

    private JPanel panel2;
    public AutoResizingProblem() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new MigLayout("insets 5, fillx", "[]", "[]5[]"));

        final JPanel content = new JPanel();
        getContentPane().add(content, "cell 0 0, grow");

        final JPanel panel = new JPanel();

        panel.setLayout(new MigLayout("insets 5 5 5 5", "[fill, grow]5[300!]", "[]10[]5[fill, grow]5[]5[]"));
        panel.setOpaque(false);
        panel.setVisible(true);


        final JLabel lblreconstruccinDelRegistro = new JLabel("<html>Reconstrucci\u00F3n del Registro de Env\u00EDos y Respuestas</html>");
        lblreconstruccinDelRegistro.setToolTipText("<html>Reconstrucci\u00F3n del Registro de Env\u00EDos y Respuestas</html>");
        lblreconstruccinDelRegistro.setOpaque(true);
        lblreconstruccinDelRegistro.setHorizontalTextPosition(SwingConstants.CENTER);
        lblreconstruccinDelRegistro.setHorizontalAlignment(SwingConstants.CENTER);
        lblreconstruccinDelRegistro.setForeground(Color.BLACK);
        lblreconstruccinDelRegistro.setFont(ARIAL_PLAIN_15);
        lblreconstruccinDelRegistro.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        lblreconstruccinDelRegistro.setBorder(new LineBorder(Color.GRAY));
        lblreconstruccinDelRegistro.setBackground(UIManager.getColor("Menu.background"));

        panel.add(lblreconstruccinDelRegistro, "cell 0 0, span 2, h 25!, grow");      

        JLabel lblSeguimiento = new JLabel("Seguimiento actual:");
        lblSeguimiento.setToolTipText("Seguimiento actual");
        lblSeguimiento.setFont(ARIAL_BOLD_14);
        panel.add(lblSeguimiento, "cell 0 1, split 3, h 25!");
        JRadioButton rbMantener = new JRadioButton();
        rbMantener.setText("Mantener");
        rbMantener.setFont(ARIAL_PLAIN_14);
        panel.add(rbMantener, ""); //add after the label of Seuigimiento, same cell.

        JRadioButton rbEliminar = new JRadioButton();
        rbEliminar.setText("Eliminar");
        rbEliminar.setFont(ARIAL_PLAIN_14);
        panel.add(rbEliminar, "grow");

        ButtonGroup group = new ButtonGroup();
        group.add(rbMantener);
        group.add(rbEliminar);

        JButton btnIniciarRBD = new JButton("Iniciar Reconstrucci\u00F3n");
        btnIniciarRBD.setFont(ARIAL_PLAIN_14);
        panel.add(btnIniciarRBD, "cell 1 1, gapleft push, h 30!, gapright 5");

        JPanel panelListasPorProcesar = new JPanel();
        panelListasPorProcesar.setLayout(new MigLayout("insets 0 0 0 0, fillx, debug","[50%]5[50%]", "[25!]5[45%]5[45%]"));
        panelListasPorProcesar.setOpaque(false);
        panelListasPorProcesar.setBorder(null);
//              panelListasPorProcesar.setBounds(10, 100, 440, 270);
        panel.add(panelListasPorProcesar, "cell 0 2, grow");

     // Label "Número de ficheros por procesar"
        JLabel lblNmeroDeFicherosPorProcesar = new JLabel();
        lblNmeroDeFicherosPorProcesar.setFont(ARIAL_BOLD_14);

        panelListasPorProcesar.add(lblNmeroDeFicherosPorProcesar, "cell 0 0, grow, span 2");

        JLabel lblBuznDeEntrada = new JLabel();
        lblBuznDeEntrada.setFont(ARIAL_PLAIN_14);
        ;

        panelListasPorProcesar.add(lblBuznDeEntrada, "cell 0 1, split 2, flowy, h 25!, grow");

        final JList listaRB01 = new JList();
        listaRB01.setOpaque(true);
        listaRB01.setBorder(null);
        listaRB01.setFont(CONSOLAS_PLAIN_14);       
        JScrollPane spRB01 = new JScrollPane();

        spRB01.getViewport().setOpaque(false);
        spRB01.setViewportView(listaRB01);

        panelListasPorProcesar.add(spRB01, "cell 0 1, grow");

        JLabel lblFicherosRnt = new JLabel();
        lblFicherosRnt.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosRnt, "cell 1 1, flowy, split 2, h 25!, grow");


        JList listaRB02 = new JList();
        listaRB02.setOpaque(true);
        listaRB02.setBorder(null);
        listaRB02.setFont(CONSOLAS_PLAIN_14);
        JScrollPane spRB02 = new JScrollPane();

        spRB02.getViewport().setOpaque(false);
        spRB02.setViewportView(listaRB02);

        panelListasPorProcesar.add(spRB02, "cell 1 1, grow");



        JLabel lblFicherosDcl = new JLabel();
        lblFicherosDcl.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosDcl, "cell 0 2, split 2, flowy, h 25!, grow");
        // Lista "Ficheros DCL"
        JList listaRB03 = new JList();
        listaRB03.setOpaque(true);
        listaRB03.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRB03 = new JScrollPane();

        spRB03.getViewport().setOpaque(false);
        spRB03.setViewportView(listaRB03);      

//              panelListasPorProcesar.add(spRB03);
        panelListasPorProcesar.add(spRB03, "cell 0 2, grow");


        JLabel lblFicherosRlc = new JLabel();
        lblFicherosRlc.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosRlc, "cell 1 2, split 2, flowy, h 25!, grow");

        // Lista "Ficheros RLC"
        JList listaRB04 = new JList();
        listaRB04.setOpaque(true);
        listaRB04.setBorder(null);
        listaRB04.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRB04 = new JScrollPane();

        spRB04.getViewport().setOpaque(false);
        spRB04.setViewportView(listaRB04);      

        panelListasPorProcesar.add(spRB04, "cell 1 2, grow");

        JLabel lblNmeroDeFicherosProcesados = new JLabel();
        lblNmeroDeFicherosProcesados.setFont(ARIAL_BOLD_14);

        panel.add(lblNmeroDeFicherosProcesados, "cell 1 2, grow, split 2, flowy, align left, h 25!");

        JList listaRBProcesados = new JList();
        listaRBProcesados.setOpaque(true);
        listaRBProcesados.setBorder(null);
        listaRBProcesados.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRBProcesados = new JScrollPane();
        spRBProcesados.setBorder(new LineBorder(Color.DARK_GRAY));
        spRBProcesados.getViewport().setOpaque(false);

        spRBProcesados.setViewportView(listaRBProcesados);



        panel.add(spRBProcesados, "cell 1 2, grow");


        JLabel lblAvance = new JLabel("A long bar");
        lblAvance.setFont(ARIAL_PLAIN_14);
        lblAvance.setForeground(Color.BLACK); 

        panel.add(lblAvance, "cell 0 3, span 2, grow");


        JButton button = new JButton("Toggle");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                CardLayout cl = null;
                cl = (CardLayout)content.getLayout();
                if (panel.isVisible()) {
                    System.out.println("show panel2");
                    cl.show(content, "panel2");
                } else if (panel2.isVisible()) {
                    System.out.println("show panel1");
                    cl.show(content, "panel1");
                }
            }
        });
        getContentPane().add(button, "cell 0 1, grow");


        content.setLayout(new CardLayout());
        content.add(panel, "panel1");

        panel2 = new JPanel() {
            @Override
            public void paintComponent(Graphics g){
                Dimension tamanio = getSize();
                ImageIcon imagenDeFondo = new ImageIcon("img/back.png");
                g.drawImage(imagenDeFondo.getImage(), 0, 0, tamanio.width, tamanio.height, null);
                setOpaque(false);
//              super.paintComponent(g);
            }

//            @Override
//            public Dimension getPreferredSize() {
//                return new Dimension(600,400);
//            }
        };

        content.add(panel2, "panel2");
//        setContentPane(panel);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                AutoResizingProblem frame = new AutoResizingProblem();

            }

        });
    }
}
当它们调整大小时,主屏幕容器也会调整大小,如果我使用一些布局管理器来管理panelCentro,图像也会调整大小,因为我猜布局管理器会调用repaint,因此,调用paintComponent来绘制背景

但是,请记住,主屏幕的大小是不可调整的,当我单击“上一步”按钮返回主屏幕时,它将返回到原始大小,并且在缩放完成之前,背景图像将显示,因此,失真

这里有一个SSCCE来显示图像是如何扭曲的。下图为示例。下载它并将其重命名为back.png,然后将其移动到项目的img目录。最大化窗口,继续单击切换按钮,每次显示面板时,图像都会展开。您注意到,看到按钮不断向下移动,在大约10次单击后,它停止调整大小

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

import net.miginfocom.swing.MigLayout;

public class AutoResizingProblem extends JFrame {

    private static final Font ARIAL_PLAIN_15 = new Font("Arial", Font.PLAIN, 15);
    private static final Font ARIAL_BOLD_14 = new Font("Arial", Font.BOLD, 14); //FONT++
    private static final Font ARIAL_PLAIN_14 = new Font("Arial", Font.PLAIN, 14); //font++
    private static final Font CONSOLAS_PLAIN_14 = new Font("Consolas", Font.PLAIN, 14); //FONT++
    private static final Font ARIAL_PLAIN_13 = new Font("Arial", Font.PLAIN, 13);//font++

    private JPanel panel2;
    public AutoResizingProblem() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new MigLayout("insets 5, fillx", "[]", "[]5[]"));

        final JPanel content = new JPanel();
        getContentPane().add(content, "cell 0 0, grow");

        final JPanel panel = new JPanel();

        panel.setLayout(new MigLayout("insets 5 5 5 5", "[fill, grow]5[300!]", "[]10[]5[fill, grow]5[]5[]"));
        panel.setOpaque(false);
        panel.setVisible(true);


        final JLabel lblreconstruccinDelRegistro = new JLabel("<html>Reconstrucci\u00F3n del Registro de Env\u00EDos y Respuestas</html>");
        lblreconstruccinDelRegistro.setToolTipText("<html>Reconstrucci\u00F3n del Registro de Env\u00EDos y Respuestas</html>");
        lblreconstruccinDelRegistro.setOpaque(true);
        lblreconstruccinDelRegistro.setHorizontalTextPosition(SwingConstants.CENTER);
        lblreconstruccinDelRegistro.setHorizontalAlignment(SwingConstants.CENTER);
        lblreconstruccinDelRegistro.setForeground(Color.BLACK);
        lblreconstruccinDelRegistro.setFont(ARIAL_PLAIN_15);
        lblreconstruccinDelRegistro.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        lblreconstruccinDelRegistro.setBorder(new LineBorder(Color.GRAY));
        lblreconstruccinDelRegistro.setBackground(UIManager.getColor("Menu.background"));

        panel.add(lblreconstruccinDelRegistro, "cell 0 0, span 2, h 25!, grow");      

        JLabel lblSeguimiento = new JLabel("Seguimiento actual:");
        lblSeguimiento.setToolTipText("Seguimiento actual");
        lblSeguimiento.setFont(ARIAL_BOLD_14);
        panel.add(lblSeguimiento, "cell 0 1, split 3, h 25!");
        JRadioButton rbMantener = new JRadioButton();
        rbMantener.setText("Mantener");
        rbMantener.setFont(ARIAL_PLAIN_14);
        panel.add(rbMantener, ""); //add after the label of Seuigimiento, same cell.

        JRadioButton rbEliminar = new JRadioButton();
        rbEliminar.setText("Eliminar");
        rbEliminar.setFont(ARIAL_PLAIN_14);
        panel.add(rbEliminar, "grow");

        ButtonGroup group = new ButtonGroup();
        group.add(rbMantener);
        group.add(rbEliminar);

        JButton btnIniciarRBD = new JButton("Iniciar Reconstrucci\u00F3n");
        btnIniciarRBD.setFont(ARIAL_PLAIN_14);
        panel.add(btnIniciarRBD, "cell 1 1, gapleft push, h 30!, gapright 5");

        JPanel panelListasPorProcesar = new JPanel();
        panelListasPorProcesar.setLayout(new MigLayout("insets 0 0 0 0, fillx, debug","[50%]5[50%]", "[25!]5[45%]5[45%]"));
        panelListasPorProcesar.setOpaque(false);
        panelListasPorProcesar.setBorder(null);
//              panelListasPorProcesar.setBounds(10, 100, 440, 270);
        panel.add(panelListasPorProcesar, "cell 0 2, grow");

     // Label "Número de ficheros por procesar"
        JLabel lblNmeroDeFicherosPorProcesar = new JLabel();
        lblNmeroDeFicherosPorProcesar.setFont(ARIAL_BOLD_14);

        panelListasPorProcesar.add(lblNmeroDeFicherosPorProcesar, "cell 0 0, grow, span 2");

        JLabel lblBuznDeEntrada = new JLabel();
        lblBuznDeEntrada.setFont(ARIAL_PLAIN_14);
        ;

        panelListasPorProcesar.add(lblBuznDeEntrada, "cell 0 1, split 2, flowy, h 25!, grow");

        final JList listaRB01 = new JList();
        listaRB01.setOpaque(true);
        listaRB01.setBorder(null);
        listaRB01.setFont(CONSOLAS_PLAIN_14);       
        JScrollPane spRB01 = new JScrollPane();

        spRB01.getViewport().setOpaque(false);
        spRB01.setViewportView(listaRB01);

        panelListasPorProcesar.add(spRB01, "cell 0 1, grow");

        JLabel lblFicherosRnt = new JLabel();
        lblFicherosRnt.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosRnt, "cell 1 1, flowy, split 2, h 25!, grow");


        JList listaRB02 = new JList();
        listaRB02.setOpaque(true);
        listaRB02.setBorder(null);
        listaRB02.setFont(CONSOLAS_PLAIN_14);
        JScrollPane spRB02 = new JScrollPane();

        spRB02.getViewport().setOpaque(false);
        spRB02.setViewportView(listaRB02);

        panelListasPorProcesar.add(spRB02, "cell 1 1, grow");



        JLabel lblFicherosDcl = new JLabel();
        lblFicherosDcl.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosDcl, "cell 0 2, split 2, flowy, h 25!, grow");
        // Lista "Ficheros DCL"
        JList listaRB03 = new JList();
        listaRB03.setOpaque(true);
        listaRB03.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRB03 = new JScrollPane();

        spRB03.getViewport().setOpaque(false);
        spRB03.setViewportView(listaRB03);      

//              panelListasPorProcesar.add(spRB03);
        panelListasPorProcesar.add(spRB03, "cell 0 2, grow");


        JLabel lblFicherosRlc = new JLabel();
        lblFicherosRlc.setFont(ARIAL_PLAIN_14);

        panelListasPorProcesar.add(lblFicherosRlc, "cell 1 2, split 2, flowy, h 25!, grow");

        // Lista "Ficheros RLC"
        JList listaRB04 = new JList();
        listaRB04.setOpaque(true);
        listaRB04.setBorder(null);
        listaRB04.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRB04 = new JScrollPane();

        spRB04.getViewport().setOpaque(false);
        spRB04.setViewportView(listaRB04);      

        panelListasPorProcesar.add(spRB04, "cell 1 2, grow");

        JLabel lblNmeroDeFicherosProcesados = new JLabel();
        lblNmeroDeFicherosProcesados.setFont(ARIAL_BOLD_14);

        panel.add(lblNmeroDeFicherosProcesados, "cell 1 2, grow, split 2, flowy, align left, h 25!");

        JList listaRBProcesados = new JList();
        listaRBProcesados.setOpaque(true);
        listaRBProcesados.setBorder(null);
        listaRBProcesados.setFont(CONSOLAS_PLAIN_14);

        JScrollPane spRBProcesados = new JScrollPane();
        spRBProcesados.setBorder(new LineBorder(Color.DARK_GRAY));
        spRBProcesados.getViewport().setOpaque(false);

        spRBProcesados.setViewportView(listaRBProcesados);



        panel.add(spRBProcesados, "cell 1 2, grow");


        JLabel lblAvance = new JLabel("A long bar");
        lblAvance.setFont(ARIAL_PLAIN_14);
        lblAvance.setForeground(Color.BLACK); 

        panel.add(lblAvance, "cell 0 3, span 2, grow");


        JButton button = new JButton("Toggle");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                CardLayout cl = null;
                cl = (CardLayout)content.getLayout();
                if (panel.isVisible()) {
                    System.out.println("show panel2");
                    cl.show(content, "panel2");
                } else if (panel2.isVisible()) {
                    System.out.println("show panel1");
                    cl.show(content, "panel1");
                }
            }
        });
        getContentPane().add(button, "cell 0 1, grow");


        content.setLayout(new CardLayout());
        content.add(panel, "panel1");

        panel2 = new JPanel() {
            @Override
            public void paintComponent(Graphics g){
                Dimension tamanio = getSize();
                ImageIcon imagenDeFondo = new ImageIcon("img/back.png");
                g.drawImage(imagenDeFondo.getImage(), 0, 0, tamanio.width, tamanio.height, null);
                setOpaque(false);
//              super.paintComponent(g);
            }

//            @Override
//            public Dimension getPreferredSize() {
//                return new Dimension(600,400);
//            }
        };

        content.add(panel2, "panel2");
//        setContentPane(panel);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                AutoResizingProblem frame = new AutoResizingProblem();

            }

        });
    }
}
我想要实现的是:

显示功能面板时,使用可调整背景大小的方式显示它们。 当返回主屏幕时,将框架定位在中间,并立即将其调整为原始未缩放的大小,或者,当它适当缩放时,不要显示它。 我现在要做的是使用空布局,将脏的手动工作列表设置为ComponentResisted。但这违背了这里许多人的教义。有没有一种方法可以通过一些布局管理器来实现这一点?如果不可能,我会说绝对定位有时是有用的


代码不是SSCCE-MigLayout丢失-因此我无法测试它

如果不希望缩放图像,请使用不带大小的drawImage方法:

public void paintComponent(Graphics g) {
    ...
    g.drawImage(imagenDeFondo.getImage(), 0, 0, null);
    ...

这个答案主要基于问题的标题

很抱歉忘记提供jar的链接。请参阅编辑。谢谢,但这不是问题所在。。。我能够自己找到JAR/链接;我不能也不想安装Stackoverflow上出现的每个JAR。但是,一个简短的、自包含的正确示例的思想是,复制和运行它应该很简单,而无需安装或下载任何其他内容。不管怎么说,你做得比我在这里看到的好多。。。