这是我目前的代码:
class loadImage extends JPanel {
private int choice;
double scale;
double currScale = 1.0;
BufferedImage img;
Timer timer;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println(choice);
g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
if (choice == 1)
{
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
int w = getWidth();
int h = getHeight();
int imageWidth = img.getWidth();
int imageHeight = img.getHeight();
double x = (w - currScale * imageWidth) / 2;
double y = (h - currScale * imageHeight) / 2;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
at.scale(currScale, currScale);
g2.drawRenderedImage(img, at);
}
else if (choice == 2)
{
Graphics2D g2 = (Graphics2D)g;
int x = 5;
int y = getHeight() - img.getHeight();
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
at.setToTranslation(x, y);
g2.drawRenderedImage(img, at);
}
}
public loadImage() {
choice = 0;
try {
img = ImageIO.read(new File("pic.png"));
} catch (IOException ex) {
}
}
public void setChoice(int choice) {
this.choice = choice;
}
public void setCurrScale(double currScale) {
this.currScale = currScale;
repaint();
}
public double getCurrScale() {
return currScale;
}
}
public class NewJFrame extends javax.swing.JFrame {
/**
* Creates new form NewJFrame
*/
public NewJFrame() {
initComponents();
setLocationRelativeTo(null);
}
public void ZoomIn(double scale) {
if(scale > ((loadImage)imageArea).getCurrScale())
{
double scaleAddOn = 0.1;
Timer timer;
timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
double currScale;
currScale = ((loadImage)imageArea).getCurrScale();
if(currScale < scale)
{
((loadImage)imageArea).setCurrScale(currScale + scaleAddOn);
}
}
});
if(((loadImage)imageArea).getCurrScale() >= scale)
{
timer.stop();
}
else
{
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
else JOptionPane.showMessageDialog(rootPane, "Fail Zoom In\nScale: " + scale + "\nCurrScale: " + ((loadImage)imageArea).getCurrScale());
}
public void ZoomOut(double scale) {
if(scale < ((loadImage)imageArea).getCurrScale())
{
double scaleDecrement = 0.1;
Timer timer;
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
double currScale;
currScale = ((loadImage)imageArea).getCurrScale();
if(scale < currScale)
{
((loadImage)imageArea).setCurrScale(currScale - scaleDecrement);
}
}
});
if(scale > ((loadImage)imageArea).getCurrScale())
{
timer.stop();
}
else
{
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
else JOptionPane.showMessageDialog(rootPane, "Fail Zoom Out\nScale: " + scale + "\nCurrScale: " + ((loadImage)imageArea).getCurrScale());
}
private void resetImageActionPerformed(java.awt.event.ActionEvent evt) {
((loadImage)imageArea).setChoice(0);
this.repaint();
}
private void zoomInActionPerformed(java.awt.event.ActionEvent evt) {
((loadImage)imageArea).setChoice(1);
this.repaint();
ZoomIn(3.0);
}
private void printScaleActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println(((loadImage)imageArea).getCurrScale());
}
private void zoomOutActionPerformed(java.awt.event.ActionEvent evt) {
((loadImage)imageArea).setImage(1);
this.repaint();
ZoomOut(1.0);
}
目标是显示图像,然后添加放大,缩小和移动它。
有关图像的详细信息=其尺寸为1280 x 1024 GUI jpanel的尺寸为563 x 377。 程序运行时,图像完全适合JPanel 563乘377.
放大完成它的工作,但当我执行它并减慢计时器时,我注意到它似乎没有开始遵循JPanel的尺寸,而是原始尺寸。当放大代码运行时,它将恢复为原始尺寸(现在在jpanel中裁剪),然后进行缩放。
缩小代码的作用与图像尺寸更改相同。它实际上并没有缩小。我最终在屏幕上看到的是图像按比例放大,然后向后缩小与放大的数量相同。它只是在那个不变的循环中。我按下printScale按钮,它返回完全相同的数字,即使不管该循环的哪一部分正在显示。
翻译(如果选择== 2)也是同样的交易。它不遵循JPanel的图像大小,而是遵循实际图像大小。
为什么即使g.drawImage(img,0,0,getWidth(),getHeight(),null),选择中的图像也不会跟随图像的大小;被称为? 为什么我的缩小方法的行为方式是这样的? 抱歉阅读不愉快。任何帮助表示赞赏。
MY FIX: 我最终放弃了他们的线程同行的计时器,并没有更多的放大和缩小的问题。我还在试图找出g.drawImage的东西以及如何使它们保持一致。当我弄明白时,我会再次更新。