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添加到构造函数中。再次感谢