Как я могу слушать, когда это приложение Java изменяется? - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть это базовое Java-приложение, в котором dim_x и dim_y представляют размеры окна и холста внутри него. Как я могу изменить эти значения, когда пользователь изменяет размер окна, чтобы то, что нарисовано на холсте, соответственно уменьшалось / расширялось?

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
    }
}

EDIT: следуя ответу Биньямина, я попытался добавить это, что работает, но есть ли лучший способ сделать это? Например, если не делать canvas статичным, может быть?

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
    }
}

Ответы [ 3 ]

7 голосов
/ 14 февраля 2012

Добавьте компонентный слушатель и внедрите componentResized. Смотрите здесь .

frame.addComponentListener(new ComponentListener(){
    @Override
    public void componentResized(ComponentEvent e) {
        //Get size of frame and do cool stuff with it   
    }
}
4 голосов
/ 14 февраля 2012
  1. Не смешивайте компоненты AWT & Swing без веской причины (такое использование не является веской причиной).Вместо Canvas вы можете использовать JComponent или JPanel.
  2. Здесь нет варианта использования для определения изменения размера.Если размер пользовательского интерфейса изменяется, будет вызываться paint() или paintComponent() пользовательского компонента рендеринга, и вы можете просто getWidth() / getHeight() узнать размер области рендеринга.
1 голос
/ 09 мая 2013

По моему опыту, когда AWT Canvas вложен в JPanel, метод paint () Canvas вызывается при расширении окна, но не при его сжатии.Таким образом, холст может расти, но никогда не уменьшаться.Вместо этого я реорганизовал подкласс Canvas с использованием подклассов из JComponent.

...