调整此Java应用程序的大小时,我如何侦听?

调整此Java应用程序的大小时,我如何侦听?,java,swing,events,listener,awt,Java,Swing,Events,Listener,Awt,我在witchdim_x和dim_y中有一个基本的Java应用程序,它表示窗口的维度和其中的画布。当用户更改窗口大小时,如何使这些值发生更改,以便画布上绘制的内容相应地收缩/扩展 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MLM extends Canvas { static int dim_x = 720; static int dim_y = 480;

我在witch
dim_x
dim_y
中有一个基本的Java应用程序,它表示窗口的维度和其中的画布。当用户更改窗口大小时,如何使这些值发生更改,以便画布上绘制的内容相应地收缩/扩展

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

public class MLM extends Canvas {
    static int dim_x = 720;
    static int dim_y = 480;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Canvas canvas = new MLM();
        canvas.setSize(dim_x, dim_y);
        frame.getContentPane().add(canvas);

        frame.pack();
        frame.setVisible(true);
    }

    public void paint(Graphics g) {
        // some stuff is drawn here using dim_x and dim_y
    }
}
编辑: 按照Binyamin的回答,我试着添加这一点,这是有效的,但有更好的方法吗?比如说,不做
canvas
static,可能吧

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

public class MLM extends Canvas {
    static int dim_x = 720;
    static int dim_y = 480;
    static Canvas canvas;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        canvas = new MLM();
        canvas.setSize(dim_x, dim_y);
        frame.getContentPane().add(canvas);

        frame.pack();
        frame.setVisible(true);

        frame.addComponentListener(new ComponentListener(){
            public void componentResized(ComponentEvent e) {
                Dimension d = canvas.getSize();
                dim_x = d.width;
                dim_y = d.height;
            }
            public void componentHidden(ComponentEvent e) {}
            public void componentMoved(ComponentEvent e) {}
            public void componentShown(ComponentEvent e) {}
        });
    }

    public void paint(Graphics g) {
        // some stuff is drawn here using dim_x and dim_y
    }
}

添加一个组件侦听器,并实现
componentResized

  • 没有充分的理由不要混合AWT和Swing组件(这种使用不是很好的理由)。您可以使用
    JComponent
    JPanel来代替
    Canvas
  • 这里没有检测调整大小的用例。如果调整UI的大小,将调用自定义渲染组件的
    paint()
    paintComponent()
    ,您只需
    getWidth()
    /
    getHeight()
    即可发现渲染区域的大小

  • 根据我的经验,当AWT画布嵌套在JPanel中时,画布的paint()方法在窗口展开时调用,而不是在窗口收缩时调用。因此,画布可以增长,但决不会收缩。我用JComponent的子类化来重构子类化画布。

    这太棒了。谢谢@Binyamin Sharet!我得到了你的建议,可以使用我的代码的其余部分(见上面的编辑),但是有更好的方法吗?与中一样,如果不将
    canvas
    设置为静态,那么可能?ComponentEvent有一个getComponent()方法,因此如果不想存储变量,就不需要存储变量。如果你想让它成为一个局部变量,你必须使它成为最终变量。
    frame.addComponentListener(new ComponentListener(){
        @Override
        public void componentResized(ComponentEvent e) {
            //Get size of frame and do cool stuff with it   
        }
    }