Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 如何使用计时器动态调整帧大小?_Java_Swing_User Interface_Timer_Jframe - Fatal编程技术网

Java 如何使用计时器动态调整帧大小?

Java 如何使用计时器动态调整帧大小?,java,swing,user-interface,timer,jframe,Java,Swing,User Interface,Timer,Jframe,我正在尝试使用计时器对象动态调整窗口大小,但没有成功。。。我在构造函数中设置了面板的首选大小,这很好地设置了窗口的大小,尽管只设置了一次。程序初始化后,首选大小会更改,但窗口大小保持不变。为什么?因为构造函数只初始化一次,因此不受大小更改的影响?如果是这样的话,我怎样才能实时调整窗口的大小呢 我知道这不会解决开始评论中给出的练习中的问题,所以请忽略以下内容:-) /* *练习18.15 * *“(放大和缩小图像)编写一个小程序,显示一系列图像 *不同大小的图像文件。最初,此图像的查看区域为 *

我正在尝试使用计时器对象动态调整窗口大小,但没有成功。。。我在构造函数中设置了面板的首选大小,这很好地设置了窗口的大小,尽管只设置了一次。程序初始化后,首选大小会更改,但窗口大小保持不变。为什么?因为构造函数只初始化一次,因此不受大小更改的影响?如果是这样的话,我怎样才能实时调整窗口的大小呢

我知道这不会解决开始评论中给出的练习中的问题,所以请忽略以下内容:-)

/*
*练习18.15
* 
*“(放大和缩小图像)编写一个小程序,显示一系列图像
*不同大小的图像文件。最初,此图像的查看区域为
*宽度为300,高度为300。您的程序应不断缩小
*观察区域的宽度和高度分别为1和1,直到宽度达到50和
*高度为50。此时,观察区域应连续扩大
*宽度为1,高度为1,直到宽度为300,高度为300。
*查看区域应缩小和放大(交替)以创建动画
*对于单个图像。”
* 
*创建日期:2014.01.07
*/
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类Ex_18_15扩展JApplet{
//主要方法
公共静态void main(字符串[]args){
JFrame=新JFrame();
Ex_18_15 applet=新的Ex_18_15();
applet.isstandlone=true;
frame.add(applet);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
//数据字段
私有布尔值IsStandlone=false;
private Image=new-ImageIcon(“greenguy.png”).getImage();
专用int xCoordinate=360;
私人国际协调=300;
私人定时器=新定时器(20,新定时器侦听器());
私有DrawPanel=新DrawPanel();
//建造师
公共Ex_18_15(){
面板。设置首选尺寸(新尺寸(xCoordinate,yCoordinate));
添加(面板);
timer.start();
}
类DrawPanel扩展了JPanel{
@凌驾
受保护组件(图形g){
超级组件(g);
g、 drawImage(图像,0,0,this);
}
}
类TimerListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
如果(yCoordinate=300){
协调--;
协调--;
}
面板。设置首选尺寸(新尺寸(xCoordinate,yCoordinate));
重新油漆();
}
}
}

您需要重新打包JFrame以调整其大小。例如,在ActionListener的末尾:

Window win = SwingUtilities.getWindowAncestor(panel);
win.pack();
但有一个问题要问你:为什么你的类扩展了JApplet而不是JPanel?或者,如果它需要一个小程序,为什么要把它塞进JFrame


编辑
关于你的评论:


它通常会扩展JFrame而不是JPanel吗?我把它塞进了一个JFrame,让它既可以作为应用程序运行,也可以作为小程序运行。这就是《Java编程简介》告诉我的方法:p在actionPerformed方法的末尾添加代码对我没有任何帮助;o

大多数GUI代码应该面向创建JPanel,而不是JFrames或JApplets。然后,您可以毫无困难地将JPanel放置在需要和期望的位置。你的书有严重的问题,如果它告诉你这些,就不应该被信任


编辑2
为我工作:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ShrinkingGui extends JPanel {
   private static final int INIT_W = 400;
   private static final int INIT_H = INIT_W;
   private static final int TIMER_DELAY = 20;
   private int prefW = INIT_W;
   private int prefH = INIT_H;

   public ShrinkingGui() {
      new Timer(TIMER_DELAY, new TimerListener()).start();;
   }

   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         if (prefW > 0 && prefH > 0) {
            prefW--;
            prefH--;
            Window win = SwingUtilities.getWindowAncestor(ShrinkingGui.this);
            win.pack();
         } else {
            ((Timer)e.getSource()).stop();
         }
      }
   }

   private static void createAndShowGUI() {
      ShrinkingGui paintEg = new ShrinkingGui();

      JFrame frame = new JFrame("Shrinking Gui");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

您需要重新打包JFrame以调整其大小。例如,在ActionListener的末尾:

Window win = SwingUtilities.getWindowAncestor(panel);
win.pack();
但有一个问题要问你:为什么你的类扩展了JApplet而不是JPanel?或者,如果它需要一个小程序,为什么要把它塞进JFrame


编辑
关于你的评论:


它通常会扩展JFrame而不是JPanel吗?我把它塞进了一个JFrame,让它既可以作为应用程序运行,也可以作为小程序运行。这就是《Java编程简介》告诉我的方法:p在actionPerformed方法的末尾添加代码对我没有任何帮助;o

大多数GUI代码应该面向创建JPanel,而不是JFrames或JApplets。然后,您可以毫无困难地将JPanel放置在需要和期望的位置。你的书有严重的问题,如果它告诉你这些,就不应该被信任


编辑2
为我工作:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ShrinkingGui extends JPanel {
   private static final int INIT_W = 400;
   private static final int INIT_H = INIT_W;
   private static final int TIMER_DELAY = 20;
   private int prefW = INIT_W;
   private int prefH = INIT_H;

   public ShrinkingGui() {
      new Timer(TIMER_DELAY, new TimerListener()).start();;
   }

   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         if (prefW > 0 && prefH > 0) {
            prefW--;
            prefH--;
            Window win = SwingUtilities.getWindowAncestor(ShrinkingGui.this);
            win.pack();
         } else {
            ((Timer)e.getSource()).stop();
         }
      }
   }

   private static void createAndShowGUI() {
      ShrinkingGui paintEg = new ShrinkingGui();

      JFrame frame = new JFrame("Shrinking Gui");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

它通常会扩展JFrame而不是JPanel吗?我把它塞进了一个JFrame,让它既可以作为应用程序运行,也可以作为小程序运行。这就是《Java编程简介》告诉我的方法:p在actionPerformed方法的末尾添加代码对我没有任何帮助;到目前为止(第18章),所有GUI类都扩展了JFrame。也就是说,我只做过非常小的GUI程序。谢谢你的洞察力!谢谢,最后一个回复是对此的评论。更详细地说,到目前为止,所有GUI程序都由一个扩展JFrame的主类组成,并将用于绘制和分组组件的JPanel添加到构造函数中。再次感谢,它通常不是扩展JFrame而不是JPanel吗?我把它塞进了一个JFrame,让它既可以作为应用程序运行,也可以作为小程序运行。这就是《Java编程简介》告诉我的方法:p在actionPerformed方法的末尾添加代码对我没有任何帮助;到目前为止(第18章),所有GUI类都扩展了JFrame。也就是说,我只做过非常小的GUI程序。谢谢你的洞察力!谢谢,最后一个回复是对此的评论。更详细地说,到目前为止,所有GUI程序都由一个扩展JFrame的主类组成,并将用于绘制和分组组件的JPanel添加到构造函数中。再次感谢