Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 如何正确更新JLabel中的图像?_Java_Image_Swing_Awt_Jlabel - Fatal编程技术网

Java 如何正确更新JLabel中的图像?

Java 如何正确更新JLabel中的图像?,java,image,swing,awt,jlabel,Java,Image,Swing,Awt,Jlabel,我是法国人,所以我的英语很差,但我对java有一个真正的问题: 我正在尝试显示一个使用一些fillRect&co手动构建的图像 它起作用了。接下来,我想根据我在文本字段中输入的文本更新此图像。问题是:它不会改变任何东西,如果我手动重新缩放JFrame的窗口,图像会显示完全变形或严重缩放 我是一个初学者,我在GUI方面有困难,尤其是当我想把它和图像结合起来的时候 你能帮我吗?为什么它不能像我想要的那样工作?下面是我的代码,有点长,但实际上很简单!谢谢:) 我做了一些修改,这是2e版本。 现在的问

我是法国人,所以我的英语很差,但我对java有一个真正的问题: 我正在尝试显示一个使用一些
fillRect
&co手动构建的图像

它起作用了。接下来,我想根据我在文本字段中输入的文本更新此图像。问题是:它不会改变任何东西,如果我手动重新缩放
JFrame
的窗口,图像会显示完全变形或严重缩放

我是一个初学者,我在GUI方面有困难,尤其是当我想把它和图像结合起来的时候

你能帮我吗?为什么它不能像我想要的那样工作?下面是我的代码,有点长,但实际上很简单!谢谢:)


我做了一些修改,这是2e版本。

现在的问题是,我无法更改条件以修改简单矩形的颜色,请在输入字段中尝试“lol”

代码版本2
先前代码
我发现您的代码中有几个问题:

  • 您将
    g
    成员变量与
    paint
    方法的
    g
    参数混淆。调用
    lol
    时,
    g
    null
    ,您会得到一个
    NullPointerException
  • 永远不要抓住
    图形
    (只有在非常罕见的情况下)。相反,您可以正确地覆盖
    paintComponent()
    ,并使用
    Graphics
    参数绘制所需内容。要更新组件时,可调用
    repaint()
  • 不要覆盖
    paint
    ,而是覆盖
    paintComponent()
  • 不要覆盖
    JFrame
    paint
    。为此使用专用组件。无需使用JLabel,一个简单的
    JComponent
    就足够了
  • 如果没有扩展JFrame的功能,请不要扩展它
  • 将组件添加到组件层次结构后,调用
    revalidate()
  • 修复这些问题,如果您仍然有问题,请提出另一个问题

    你应该考虑阅读和接下来的几步。它将向您展示与您正在尝试做的事情类似的基本示例

    编辑: 我拿走了你的V2代码并尽可能地修补了它。这远远不够完美,但您应该了解如何做到这一点:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class Fenetre extends JComponent {
    
        private boolean color;
    
        /**
         * Constructeur de l'objet
         */
        public Fenetre() {
            color = true;
            setPreferredSize(new Dimension(1000, 300));
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, 1000, 300);
            if (color) {
                g.setColor(Color.orange);
            } else {
                g.setColor(Color.blue);
            }
            g.fillRect(8, 25, 200, 100);
            g.setColor(Color.green);
            g.drawString("Text", 10, 10);
        }
    
        public void lol() {
            if (color) {
                color = false;
            } else {
                color = true;
            }
            repaint();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    initUI();
                }
            });
        }
    
        protected static void initUI() {
            JFrame frame = new JFrame();
            frame.setTitle("Animation");
            frame.setSize(1000, 400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
    
            JPanel container = new JPanel();
            final JTextField jtf = new JTextField();
            final Fenetre fenetre = new Fenetre();
            JLabel label = new JLabel("Commandes   ");
            JButton b = new JButton("OK");
            container.setBackground(Color.white);
            container.setLayout(new BorderLayout());
    
            JPanel top = new JPanel();
            jtf.setPreferredSize(new Dimension(800, 30));
            class BoutonListener implements ActionListener {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (jtf.getText().equals("lol")) {
                        fenetre.lol();
                    }
                    System.out.println("Entry  : " + jtf.getText());
                }
            }
            b.addActionListener(new BoutonListener());
    
            top.add(fenetre);
            top.add(label);
            top.add(jtf);
            top.add(b);
            top.revalidate();
            frame.setContentPane(top);
            frame.setVisible(true);
        }
    }
    

    您的Swing图形编程有几个重大问题,我建议您仔细阅读教程,了解如何更好地完成这些工作。例如,你是

    • 直接调用paint方法——除了在非常特殊的情况下(这不是其中之一),您几乎不应该这样做
    • 直接在JFrame的
      绘制(…)
      方法中绘制。相反,您需要绘制从JComponent派生的类(如JPanel)的
      paintComponent(…)
      方法重写
    • 不必要地调用update,就好像这是AWT程序一样。你不会在秋千上这样做,除非你改变了外观和感觉
    再一次,看看这方面的教程——相信我,你不会后悔这么做的


    编辑--太慢了!1+向纪尧姆

    祝贺你,你触摸到了那万人的神奇身影:-)非常感谢!现在图像已经正确显示,唯一的问题是,当我在输入字段中使用命令“lol”启动
    lol()
    时,我只是尝试更改矩形的颜色,但它没有,并且它返回一个错误作为NullPointerException(无文本?)PS:I让extensed
    JFrame
    用于repaint()方法。我不理解需要调用方法
    revalidate
    @Mizur revalidate,以便布置添加到层次结构中的组件的含义。不要自己调用paintComponent,只需调用repaint()。我将在我的帖子中添加你的代码的更新版本,因为你的代码中确实有很多问题。@Mizur:你应该通过点击左边的大复选标记来“接受”这个答案。实际上还有一个问题:InitUI()方法是静态的,所以我所有的方法也必须是静态的。这有点烦人!谢谢!我只回答另一个答案,也遵循你的建议:D
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Color;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.ParseException;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import javax.swing.ImageIcon;
    
    public class Fenetre extends JFrame {
    
        private JPanel container = new JPanel();
        private JTextField jtf;
        private JLabel label = new JLabel("Commandes   ");
        private JButton b = new JButton ("OK");
        private Graphics g;
        private Image img;
        private JLabel screen;
    
        /**
         * Constructeur de l'objet 
         */
        public Fenetre(){
    
            this.setTitle("Animation");
            this.setSize(1000, 400);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
    
            container.setBackground(Color.white);
            container.setLayout(new BorderLayout());
    
    
            JPanel top = new JPanel();
    
            jtf = new JTextField();
    
            jtf.setPreferredSize(new Dimension(800, 30));
    
            b.addActionListener(new BoutonListener());
    
            this.setContentPane(top);
            this.setVisible(true); 
    
            paint(g);
    
            screen = new JLabel( new ImageIcon(img));
    
            top.add(screen);
            top.add(label);
            top.add(jtf);
            top.add(b);
    
    
            this.setContentPane(top);
         }      
    
    
        class BoutonListener implements ActionListener{ 
            public void actionPerformed(ActionEvent e) {
                    System.out.println("Entry  : " + jtf.getText());
                    if(jtf.getText().equals("lol")) lol();
            }  
        }
    
        @Override
        public void paint(Graphics g)
        {
            if(img == null) {
                img = createImage(1000,300);
                g = img.getGraphics();
            }
            g.setColor(Color.white);
            g.fillRect(0,0,1000,300);
            g.setColor(Color.orange);
            g.fillRect(8,25,200,100);
            g.setColor(Color.green);
            g.drawString("Text",10,10);
        }
    
        @Override
        public void update(Graphics g)
        {
            g.setColor(Color.blue);
            g.fillRect(8,25,300,100);
        }
    
        public void lol()
        {
            g.setColor(Color.blue);
            g.fillRect(8,25,200,100);
        }
    }
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class Fenetre extends JComponent {
    
        private boolean color;
    
        /**
         * Constructeur de l'objet
         */
        public Fenetre() {
            color = true;
            setPreferredSize(new Dimension(1000, 300));
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, 1000, 300);
            if (color) {
                g.setColor(Color.orange);
            } else {
                g.setColor(Color.blue);
            }
            g.fillRect(8, 25, 200, 100);
            g.setColor(Color.green);
            g.drawString("Text", 10, 10);
        }
    
        public void lol() {
            if (color) {
                color = false;
            } else {
                color = true;
            }
            repaint();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    initUI();
                }
            });
        }
    
        protected static void initUI() {
            JFrame frame = new JFrame();
            frame.setTitle("Animation");
            frame.setSize(1000, 400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
    
            JPanel container = new JPanel();
            final JTextField jtf = new JTextField();
            final Fenetre fenetre = new Fenetre();
            JLabel label = new JLabel("Commandes   ");
            JButton b = new JButton("OK");
            container.setBackground(Color.white);
            container.setLayout(new BorderLayout());
    
            JPanel top = new JPanel();
            jtf.setPreferredSize(new Dimension(800, 30));
            class BoutonListener implements ActionListener {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (jtf.getText().equals("lol")) {
                        fenetre.lol();
                    }
                    System.out.println("Entry  : " + jtf.getText());
                }
            }
            b.addActionListener(new BoutonListener());
    
            top.add(fenetre);
            top.add(label);
            top.add(jtf);
            top.add(b);
            top.revalidate();
            frame.setContentPane(top);
            frame.setVisible(true);
        }
    }