gpt4 book ai didi

java - JFrame 重绘时不刷新

转载 作者:行者123 更新时间:2023-12-01 11:00:05 24 4
gpt4 key购买 nike

我编写了一段小代码,用于使用 SWING 在 Java 中简单地调整系统上任何图像的大小。

http://ideone.com/9vii2E

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;

class T extends JPanel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = -2900955352094956729L;
int x = 0;
int flag = 0;
BufferedImage b;
Image z;
JButton j, a, cl;
JTextField ht, wdth;

T() {
j = new JButton("Hi");
a = new JButton("Resizze");
a.addActionListener(this);
add(a);
j.addActionListener(this);
add(j);
setBackground(Color.WHITE);

}

class tobi implements ActionListener {// for close button of second window
public void actionPerformed(ActionEvent asd) {
// if(x==1)
{
int gadda = 100, w = 100;
gadda = Integer.parseInt(ht.getText());
w = Integer.parseInt(wdth.getText());
z = z.getScaledInstance(gadda, w, Image.SCALE_SMOOTH);
setBackground(Color.BLACK);
j.repaint();
JButton ttr = (JButton) asd.getSource();
Window qwe = SwingUtilities.windowForComponent(ttr);
qwe.setVisible(false);
}
}

}

public void meth()// method to create second window
{
JFrame win = new JFrame();
win.setTitle("resizze!!");
win.setLayout(new FlowLayout());
JLabel height = new JLabel("Height:");
ht = new JTextField(20);

JLabel width = new JLabel("Width:");
wdth = new JTextField(20);
JButton cl = new JButton("close");

cl.addActionListener(new tobi());
win.add(height);
win.add(ht);
win.add(width);
win.add(wdth);
win.add(cl);
win.pack();
win.setVisible(true);
}

public void paintComponent(Graphics g) {

Graphics2D gt = (Graphics2D) g;
super.paintComponent(g);
if (x == 1)
g.drawImage(z, 0, 0, null);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == j) {
JFileChooser q = new JFileChooser();
// q.setFileFilter(new
// FileNameExtensionFilter("Image Files",ImageIO.getReaderFileSuffixes()));
q.addChoosableFileFilter(new FileNameExtensionFilter("Image Files",
"jpg", "jpeg", "png"));
int option = q.showOpenDialog(null);
if (option == JFileChooser.APPROVE_OPTION) {
File f = q.getSelectedFile();
try {
b = ImageIO.read(f);
z = b.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
} catch (IOException ae) {
}
}
x = 1;
repaint();
}

else if (e.getSource() == a) {
meth();
}

}

public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
JFrame j = new JFrame();
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setSize(500, 500);
j.add(new T());
j.setVisible(true);
j.revalidate();
j.repaint();

}
});
}
}

我要求用户上传图像文件,然后采用参数高度和宽度来调整大小。单击第二个窗口中的关闭按钮后,没有任何反应(除了前几次),而第一个窗口上的图像应该重新绘制。(抱歉变量名称和格式错误)

最佳答案

你有一大堆问题,变量命名只是其中之一......

g.drawImage(z, 0, 0, null);应该是g.drawImage(z, 0, 0, this); ,这确保了如果由于某种原因图像仍在处理,组件可以响应它的任何更改并根据自己的意愿更新安排新的重绘

不要忽视异常

try {
b = ImageIO.read(f);
z = b.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
} catch (IOException ae) {

}

应该(至少)

try {
b = ImageIO.read(f);
z = b.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
} catch (IOException ae) {
ae.printStackTrace();
}

这将帮助您解决代码中可能出现的问题。

我还将上面的内容更改为

try {
b = ImageIO.read(f);
z = b;
} catch (IOException ae) {
ae.printStackTrace();
}

因此,您首先会看到原始图像(这只是我的意见),但由于此时您没有任何真正的缩放属性,所以这对我来说是有意义的。

您正在跟踪 cl变量,将其声明为实例字段,但在 meth 中再次将其重新声明为局部变量。我不知道这是否会成为问题,但您需要意识到这一点。

z = z.getScaledInstance(gadda, w, Image.SCALE_SMOOTH);应该是z = b.getScaledInstance(gadda, w, Image.SCALE_SMOOTH); 。您希望从源头进行扩展,否则您将遇到很多像素化问题。

您还调用j.repaint();这只是重新绘制按钮,这显然不是您想要做的,相反您应该只调用 repaint()在面板本身上

您还应该看看The Perils of Image.getScaledInstance()this examplethis example有关如何进行更好的扩展操作的示例

关于java - JFrame 重绘时不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33413188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com