2013-02-12 2 views
0

Я добавил ComponentAdapter как ComponentListener к моим JDialog, и я хочу реализовать componentResized(ComponentEvent e). Цель состоит в том, чтобы поддерживать соотношение JDialog, и для моего расчета того, как изменить его размер в соответствии с действием пользователя, я хотел бы знать, перетащил ли пользователь окно окна, верхний/нижний край окна , или один из окон углов.Как определить, какое действие пользователя вызвало событие изменения размера JDialog?

Есть ли способ получить эту информацию от ComponentEvent?

+0

Что вы подразумеваете под «поддержанием скорости JDialog»? В этом контексте слово «ставка» путается. В целом вы, похоже, пытаетесь сделать что-то, что библиотека/структура пользовательского интерфейса не настроена, но вы могли бы достичь общей цели по-другому. Поэтому я ищу дополнительную информацию об общей цели. – arcy

+0

JDialog содержит изображение. Я хочу разрешить пользователю изменять размер окна, но сохранить размер изображения. поэтому мне нужно пересчитать размер изображения и окна в соответствии с действием пользователя (если пользователь увеличивает ширину, размер должен соответственно увеличиваться и т. д.). Думаю, я смогу достичь той же цели, сохранив предыдущий размер и сравню его с новым размером ... Но меня все еще интересует ответ на исходный ответ. Я понимаю, что ваш ответ - это невозможно. – Elist

+0

Я бы не сказал «невозможно», но я имел в виду сказать, что необычно быть «необычным» с доказательствами того, что пользовательский интерфейс не обеспечивает его. Не вдаваясь в это, я бы подумал, что этого будет достаточно, чтобы получить событие изменения размера, получить текущую высоту/ширину диалога, определить максимальную высоту/ширину вашего изображения, которая будет соответствовать там с правильным соотношением (это то, что я сейчас подумайте, что вы имеете в виду под «скоростью» и перерисовываете. Вам не нужна предыдущая информация, если только она не устраняет перерисовку, если размер идентичен, и какие измерения изменены. – arcy

ответ

0

Я не знаю ответа для моего первоначального вопроса (это способ рассказать источник ComponentEvent), поэтому я просто храню предыдущие измерения и вычисляю новый размер. Если это кому-то помогает, это код, который я использую.

public class ResizableImageView extends JDialog { 
    BufferedImage img; 
    Dimension OriginalImgSize; 
    double imageRatio; 
    JPanel jp; 
    JLabel label; 
    Dimension previousSize; 

    public ResizableImageView(BufferedImage img) { 

     ... 

     setResizable(true); 
     this.img = img; 
     OriginalImgSize = new Dimension(img.getWidth(), img.getHeight()); 
     imageRatio = (double)img.getWidth()/(double)img.getHeight(); 

     label = new JLabel(new ImageIcon(img)); 
     label.setMinimumSize(OriginalImgSize); 
     jp = new JPanel(); 
     jp.setBorder(new EmptyBorder(0, 0, 0, 0)); 
     jp.add(label); 
     setContentPane(jp); 
     pack(); 
     previousSize = getSize(); 

     addComponentListener(new ComponentAdapter() { 
      private boolean allreadyResized = true; 

      private void resize(Image img) { 
       ImageIcon ico = new ImageIcon(img); 
       label = new JLabel(ico); 
       label.setBorder(new EmptyBorder(0, 0, 0, 0)); 
       label.setPreferredSize(new Dimension(img.getWidth(null), img.getHeight(null))); 
       jp = new JPanel(); 
       jp.setBorder(new EmptyBorder(0, 0, 0, 0)); 
       jp.add(label); 
       setContentPane(jp); 
       allreadyResized = true; 
       pack(); 
       previousSize = getSize(); 
      } 

      @Override 
      public void componentResized(ComponentEvent e) { 
       if (allreadyResized) { 
        allreadyResized = false; 
        return; 
       } 
       double xChange = (double) Math.abs(getSize().width - previousSize.width); 
       double yChange = (double) Math.abs(getSize().height - previousSize.height); 
       if (xChange == 0 && yChange == 0) return; 
       int height = getSize().height - getInsets().bottom - getInsets().top; 
       int width = getSize().width - getInsets().left - getInsets().right; 

       if (height > OriginalImgSize.height 
         || width > OriginalImgSize.width) { 
        resize(img); 
        return; 
       } 
       if (yChange == 0 || xChange/yChange > imageRatio) { 
        resize(img.getScaledInstance(width, -1, Image.SCALE_SMOOTH)); 
        return; 
       } else { 
        resize(img.getScaledInstance(-1, height, Image.SCALE_SMOOTH)); 
        return; 
       } 
      } 
     }); 
    } 
} 
Смежные вопросы