Java 如何正确更新JLabel中的图像?
我是法国人,所以我的英语很差,但我对java有一个真正的问题: 我正在尝试显示一个使用一些Java 如何正确更新JLabel中的图像?,java,image,swing,awt,jlabel,Java,Image,Swing,Awt,Jlabel,我是法国人,所以我的英语很差,但我对java有一个真正的问题: 我正在尝试显示一个使用一些fillRect&co手动构建的图像 它起作用了。接下来,我想根据我在文本字段中输入的文本更新此图像。问题是:它不会改变任何东西,如果我手动重新缩放JFrame的窗口,图像会显示完全变形或严重缩放 我是一个初学者,我在GUI方面有困难,尤其是当我想把它和图像结合起来的时候 你能帮我吗?为什么它不能像我想要的那样工作?下面是我的代码,有点长,但实际上很简单!谢谢:) 我做了一些修改,这是2e版本。 现在的问
fillRect
&co手动构建的图像
它起作用了。接下来,我想根据我在文本字段中输入的文本更新此图像。问题是:它不会改变任何东西,如果我手动重新缩放JFrame
的窗口,图像会显示完全变形或严重缩放
我是一个初学者,我在GUI方面有困难,尤其是当我想把它和图像结合起来的时候
你能帮我吗?为什么它不能像我想要的那样工作?下面是我的代码,有点长,但实际上很简单!谢谢:)
我做了一些修改,这是2e版本。 现在的问题是,我无法更改条件以修改简单矩形的颜色,请在输入字段中尝试“lol” 代码版本2
先前代码
我发现您的代码中有几个问题:
g
成员变量与paint
方法的g
参数混淆。调用lol
时,g
为null
,您会得到一个NullPointerException
图形
(只有在非常罕见的情况下)。相反,您可以正确地覆盖paintComponent()
,并使用Graphics
参数绘制所需内容。要更新组件时,可调用repaint()
paint
,而是覆盖paintComponent()
JFrame
的paint
。为此使用专用组件。无需使用JLabel,一个简单的JComponent
就足够了revalidate()
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让extensedJFrame
用于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);
}
}