如何正确地更新一个JLabel图像? [英] How to correctly update an Image in a JLabel?

查看:195
本文介绍了如何正确地更新一个JLabel图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是法国人,所以我的英语很糟糕,但我用java一个真正的问题:
我试图表现出一些手动生成的映像 fillRect &安培;合。

它的工作原理。接下来,我要更新这个形象,我在文本字段中输入文本的功能。还有的问题:它不会改变任何东西,如果我手动重新调整的窗口中的的JFrame ,图像显示完全变形或严重缩放

我是个初学者,我有moreso时,我想用图片夫妇将其与GUI,困难。

你能帮助我吗?为什么它不工作,我想要什么?这是我的code以下,有点长,但其实很简单!感谢:)


我已经改变了一点,这是2E版本。

现在的问题S中的我不能改变的条件,以便修改一个简单的矩形的颜色,尝试笑在输入字段!

code版本2

 进口java.awt.Graphics;
进口java.awt.Image中;
进口java.awt.Color中;
进口java.awt.BorderLayout中;
进口java.awt.Dimension中;
进口java.awt.event.ActionEvent中;
进口java.awt.event.ActionListener;
进口java.text.ParseException;进口javax.swing.JFrame中;
进口javax.swing.JPanel中;
进口javax.swing.JTextField中;
进口javax.swing.JLabel中;
进口javax.swing.JButton中;
进口javax.swing.ImageIcon中;公共类FENETRE扩展的JFrame {
    私人的JFrame框架;
    私人的JPanel容器=新JPanel();
    私人JTextField的联合特遣部队;
    私人标签的JLabel =新的JLabel(Commandes);
    私人的JButton B =新的JButton(OK);
    私人图形图形;
    私人图片IMG;
    私人的JLabel屏;
    私人布尔色;    / **
     * CONSTRUCTEUR DE L'OBJET
     * /
    公共FENETRE(){
        颜色= TRUE;
        帧=新的JFrame();
        frame.setTitle(动画);
        frame.setSize(1000,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(NULL);        container.setBackground(Color.white);
        container.setLayout(新的BorderLayout());
        JPanel的顶部=新JPanel();        JTF =新的JTextField();        jtf.set preferredSize(新尺寸(800,30));        b.addActionListener(新BoutonListener());        frame.setContentPane(顶部);
        frame.setVisible(真);        的paintComponent(图形);        屏幕=新的JLabel(新的ImageIcon(IMG));        top.add(屏);
        top.add(标签);
        top.add(JTF);
        top.add(二);        frame.setContentPane(顶部);
     }
    类BoutonListener实现的ActionListener {
        公共无效的actionPerformed(ActionEvent的五){
                如果(jtf.getText()等于(笑)。)LOL();
                的System.out.println(输入:+ jtf.getText());
        }
    }    公共无效的paintComponent(图形G)
    {
        如果(IMG == NULL){
            IMG = frame.createImage(1000,300);
            G = img.getGraphics();
        }
        g.setColor(Color.white);
        g.fillRect(0,0,1000,300);
        如果(彩色)g.setColor(Color.orange);其他g.setColor(Color.blue);
        g.fillRect(8,25,200,100);
        g.setColor(Color.green);
        g.drawString(文本,10,10);
    }    公共无效LOL()
    {
        如果(彩色)颜色= FALSE;其他颜色= TRUE;
    }
}


preVIOUS code

 进口java.awt.Graphics;
进口java.awt.Image中;
进口java.awt.Color中;
进口java.awt.BorderLayout中;
进口java.awt.Dimension中;
进口java.awt.event.ActionEvent中;
进口java.awt.event.ActionListener;
进口java.text.ParseException;进口javax.swing.JFrame中;
进口javax.swing.JPanel中;
进口javax.swing.JTextField中;
进口javax.swing.JLabel中;
进口javax.swing.JButton中;
进口javax.swing.ImageIcon中;公共类FENETRE扩展的JFrame {    私人的JPanel容器=新JPanel();
    私人JTextField的联合特遣部队;
    私人标签的JLabel =新的JLabel(Commandes);
    私人的JButton B =新的JButton(OK);
    私有图形克;
    私人图片IMG;
    私人的JLabel屏;    / **
     * CONSTRUCTEUR DE L'OBJET
     * /
    公共FENETRE(){        this.setTitle(动画);
        this.setSize(1000,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(NULL);        container.setBackground(Color.white);
        container.setLayout(新的BorderLayout());
        JPanel的顶部=新JPanel();        JTF =新的JTextField();        jtf.set preferredSize(新尺寸(800,30));        b.addActionListener(新BoutonListener());        this.setContentPane(顶部);
        this.setVisible(真);        油漆(G);        屏幕=新的JLabel(新的ImageIcon(IMG));        top.add(屏);
        top.add(标签);
        top.add(JTF);
        top.add(二);
        this.setContentPane(顶部);
     }
    类BoutonListener实现的ActionListener {
        公共无效的actionPerformed(ActionEvent的五){
                的System.out.println(输入:+ jtf.getText());
                如果(jtf.getText()等于(笑)。)LOL();
        }
    }    @覆盖
    公共无效漆(图形G)
    {
        如果(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(文本,10,10);
    }    @覆盖
    公共无效更新(图形G)
    {
        g.setColor(Color.blue);
        g.fillRect(8,25,300,100);
    }    公共无效LOL()
    {
        g.setColor(Color.blue);
        g.fillRect(8,25,200,100);
    }
}


解决方案

我看到你的code以下几个问题:


  1. 您是混淆了的油漆先按g 参数的先按g 成员变量方法。当哈哈被称为,你会得到一个 NullPointerException异常

  2. 您永远不应该抢图形(仅适用于真正的极少数情况下)的保持。相反,你正确的paintComponent()覆盖并使用图形参数画出你想要的。当你要更新的组件,你叫重绘()

  3. 请不要覆盖油漆,但覆盖的paintComponent()

  4. 请不要覆盖油漆 的JFrame 的。使用组件奉献为。没必要用一个JLabel对于这一点,一个简单的的JComponent 就足够了。

  5. 请不要延长的JFrame 如果你没有扩展其功能。

  6. 将组件添加到组件层次结构后,调用重新验证()

解决这些问题,然后回来跟另外一个问题,如果你仍然有问题。

您也许应该考虑读本教程和几下一步。它会告诉你的东西类似于你正在尝试做的基本的例子。

编辑:
我把你的V2 code和修补它,因为我可以。这是远非完美,但你应该得到的,你如何能做到这一点的要点是:

 进口java.awt.BorderLayout中;
进口java.awt.Color中;
进口java.awt.Dimension中;
进口java.awt.Graphics;
进口java.awt.event.ActionEvent中;
进口java.awt.event.ActionListener;进口javax.swing.JButton中;
进口javax.swing.JComponent中;
进口javax.swing.JFrame中;
进口javax.swing.JLabel中;
进口javax.swing.JPanel中;
进口javax.swing.JTextField中;
进口javax.swing.SwingUtilities中;公共类FENETRE扩展JComponent的{    私人布尔色;    / **
     * CONSTRUCTEUR DE L'OBJET
     * /
    公共FENETRE(){
        颜色= TRUE;
        集preferredSize(新尺寸(1000,300));
    }    @覆盖
    公共无效的paintComponent(图形G){
        super.paintComponent方法(G);
        g.setColor(Color.white);
        g.fillRect(0,0,1000,300);
        如果(彩色){
            g.setColor(Color.orange);
        }其他{
            g.setColor(Color.blue);
        }
        g.fillRect(8,25,200,100);
        g.setColor(Color.green);
        g.drawString(文本,10,10);
    }    公共无效LOL(){
        如果(彩色){
            颜色= FALSE;
        }其他{
            颜色= TRUE;
        }
        重绘();
    }    公共静态无效的主要(字串[] args){
        SwingUtilities.invokeLater(Runnable的新(){            @覆盖
            公共无效的run(){
                initUI();
            }
        });
    }    保护静态无效initUI(){
        JFrame的帧=新的JFrame();
        frame.setTitle(动画);
        frame.setSize(1000,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(NULL);        JPanel的集装箱=新JPanel();
        最终的JTextField JTF =新的JTextField();
        最后FENETRE FENETRE =新FENETRE();
        JLabel的标签=新的JLabel(Commandes);
        JButton的B =新的JButton(OK);
        container.setBackground(Color.white);
        container.setLayout(新的BorderLayout());        JPanel的顶部=新JPanel();
        jtf.set preferredSize(新尺寸(800,30));
        类BoutonListener实现的ActionListener {
            @覆盖
            公共无效的actionPerformed(ActionEvent的五){
                如果(jtf.getText()。等于(笑)){
                    fenetre.lol();
                }
                的System.out.println(输入:+ jtf.getText());
            }
        }
        b.addActionListener(新BoutonListener());        top.add(FENETRE);
        top.add(标签);
        top.add(JTF);
        top.add(二);
        top.revalidate();
        frame.setContentPane(顶部);
        frame.setVisible(真);
    }
}

I'm French so my English is quite bad but I have a real problem with java: I'm trying to show an Image built manually with some fillRect & co.

It works. Next, I want to update this image as a function of the text I enter in the text field. And there is the problem: it doesn't change anything, and if I manually rescale the window of the JFrame, the image shows totally deformed or scaled badly.

I'm a beginner and I have difficulties with GUI, moreso when I want to couple it with Images.

Can you help me? Why doesn't it work as I want? This is my code below, a bit long but actually quite simple ! Thanks :)


I've changed it a bit, this is the 2e VERSION.

Now the problem s that I can't change a condition in order to modify the color of a simple rectangle, try "lol" in the entry field !

CODE VERSION 2

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 JFrame frame;
    private JPanel container = new JPanel();
    private JTextField jtf;
    private JLabel label = new JLabel("Commandes   ");
    private JButton b = new JButton ("OK");
    private Graphics graph;
    private Image img;
    private JLabel screen;
    private boolean color;

    /**
     * Constructeur de l'objet 
     */
    public Fenetre(){
        color = true;


        frame = new JFrame();
        frame.setTitle("Animation");
        frame.setSize(1000, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.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());

        frame.setContentPane(top);
        frame.setVisible(true); 

        paintComponent(graph);

        screen = new JLabel( new ImageIcon(img));

        top.add(screen);
        top.add(label);
        top.add(jtf);
        top.add(b);

        frame.setContentPane(top);
     }      


    class BoutonListener implements ActionListener{ 
        public void actionPerformed(ActionEvent e) {
                if(jtf.getText().equals("lol")) lol();
                System.out.println("Entry  : " + jtf.getText());
        }  
    }

    public void paintComponent(Graphics g)
    {
        if(img == null) {
            img = frame.createImage(1000,300);
            g = img.getGraphics();
        }
        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;
    }
}


PREVIOUS CODE

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);
    }
}

解决方案

I see several problems in your code:

  1. You are confusing your g member variable with the g parameter of the paint method. When lol is called, g is null and you get a NullPointerException
  2. You should never grab a hold on Graphics (only in really rare cases). Instead you override properly paintComponent() and you use the Graphics parameter to draw what you want. When you want to update the component, you call repaint()
  3. Don't override paint, but override paintComponent()
  4. Don't override paint of JFrame. Use a dedicate component for that. No need to use a JLabel for that, a simple JComponent is enough.
  5. Don't extend JFrame if you are not extending its functionality.
  6. After adding components to the component hierarchy, call revalidate()

Fix those issues and come back with another question if you still have problems.

You should probably consider reading this tutorial and the few next steps. It will show you basic examples of things similar to what you are trying to do.

EDIT: I took your V2 code and patched it as I could. This is very far from perfect but you should get the gist of how you can do this:

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);
    }
}

这篇关于如何正确地更新一个JLabel图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆