2010-01-21 13 views
29

Bir kullanıcı, yeniden boyutlandırmak ve fareyi sürüklemek için JFrame'in köşesini tıklattığında, JFrame, kullanıcının sürüklediği gibi farenin geçerli konumuna göre yeniden çizilir. Bu olayları nasıl dinleyebilirsin?Kullanıcı, farelerini sürüklerken JFrame yeniden boyutlandırma olaylarını dinleyin.

public final class TestFrame extends JFrame { 
    public TestFrame() { 
     this.addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       // This is only called when the user releases the mouse button. 
       System.out.println("componentResized"); 
      } 
     }); 
    } 

    // These methods do not appear to be called at all when a JFrame 
    // is being resized. 
    @Override 
    public void setSize(int width, int height) { 
     System.out.println("setSize"); 
    } 

    @Override 
    public void setBounds(Rectangle r) { 
     System.out.println("setBounds A"); 
    } 

    @Override 
    public void setBounds(int x, int y, int width, int height) { 
     System.out.println("setBounds B"); 
    } 
} 

nasıl belirleyecek ve onlar fare etrafında sürükleyerek gibi kullanıcı (pencerenin geçerli boy oranına göre) bir pencere boyutlandırır nasıl kısıtlayabilir: Aşağıda

Şu anda denedim budur etrafında?

+0

@finnw, Bounty'nin nedenini açıklığa kavuşturabilir, çünkü "Java_1.4" ve "Java_1.5" aralarındaki farkları görebiliyorum, fakat "Java_6", "notu" için fark bulamadım ama en derinden 'Nested' ve 'Inherits Method' içine kontrol etme – mKorbel

+0

@mKorbel, Her iki yöntemi de denedim (JPanel üzerinde ComponentListener; Geçersiz kılma validate.) Kod, Java'nın her iki sürümünde derlenir ve çalışır. Java 1.6'da düzen sürekli olarak yeniden hesaplanır, ancak Java'da 1.5 sadece fareyi bıraktığımda. – finnw

+0

@finnw, JComponent veya JFrame – mKorbel

cevap

7

Muhtemelen validate gibi bir şeyi geçersiz kılmanız gerekir (süper aramak için unutmayın). Tabii ki, ana hatları sürüklemek için yapılandırılmış bir pencere sistemi kullanıyorsanız, bu hala çalışmayabilir.

+0

nasıl çağırır Bunun için süper? Ben sadece bir kurucu içinde süper arayabilirim diye düşündüm? –

+3

Whoops, buldum. super.validate(), tabiki –

37

Bir bileşen dinleyici ekleyin ve böyle componentResized işlevini uygulayabilirsiniz:

JFrame component = new JFrame("My Frame"); 

component.addComponentListener(new ComponentAdapter() 
{ 
     public void componentResized(ComponentEvent evt) { 
      Component c = (Component)evt.getSource(); 
      //........ 
     } 
}); 

DÜZENLEME: Görünüşe göre, JFrame için, componentResized olay mouseReleased olaya asılır. Bu yüzden fare düğmesi serbest bırakıldığında yöntem çağrılır.

İstediğinizi elde etmenin bir yolu, JFrame'inizin tamamını kapsayacak bir JPanel eklemektir. Sonra, componentListener'ı JPanel'e ekleyin (fareniz hala sürüklenirken bile JPanel için bileşen çağrılır). Çerçeveniz yeniden boyutlandırıldığında, paneliniz de yeniden boyutlandırılacaktır.

Bu en şık çözüm değil, ama işe yarıyor!

+0

teşekkürler. Ancak, componentResized sadece kullanıcı fare düğmesini serbest bıraktığında çağrılır. Kullanıcıları fareyi sürükleyerek * olayları yeniden boyutlandırmak * mümkün mü? – Clinton

+0

@Clinton Doğru! Bunun için üzgünüm, soruyu iyice okumadım! – Alex

+0

@Clinton Bunun nasıl yapılabileceğini merak ettim ve bulduğum tek yol JFrame'e bir JPanel eklemekti. Bunun sana yardım edip etmediğini bilmiyorum. Cevabımı güncelledim. – Alex

-2
public class MouseDrag extends Component implements MouseListener, 
    MouseMotionListener { 
    /** The Image we are to paint */ 
    Image curImage; 

    /** Kludge for showStatus */ 
    static Label status; 

    /** true if we are in drag */ 
    boolean inDrag = false; 

    /** starting location of a drag */ 
    int startX = -1, startY = -1; 

    /** current location of a drag */ 
    int curX = -1, curY = -1; 

    // "main" method 
    public static void main(String[] av) { 
    JFrame f = new JFrame("Mouse Dragger"); 
    Container cp = f.getContentPane(); 

    if (av.length < 1) { 
     System.err.println("Usage: MouseDrag imagefile"); 
     System.exit(1); 
    } 
    Image im = Toolkit.getDefaultToolkit().getImage(av[0]); 

    // create a MouseDrag object 
    MouseDrag j = new MouseDrag(im); 

    cp.setLayout(new BorderLayout()); 
    cp.add(BorderLayout.NORTH, new Label(
     "Hello, and welcome to the world of Java")); 
    cp.add(BorderLayout.CENTER, j); 
    cp.add(BorderLayout.SOUTH, status = new Label()); 
    status.setSize(f.getSize().width, status.getSize().height); 
    f.pack(); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    // "Constructor" - creates the object 
    public MouseDrag(Image i) { 
    super(); 
    curImage = i; 
    setSize(300, 200); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
    } 

    public void showStatus(String s) { 
    status.setText(s); 
    } 

    // Five methods from MouseListener: 
    /** Called when the mouse has been clicked on a component. */ 
    public void mouseClicked(MouseEvent e) { 
    } 

    /** Called when the mouse enters a component. */ 
    public void mouseEntered(MouseEvent e) { 
    } 

    /** Called when the mouse exits a component. */ 
    public void mouseExited(MouseEvent e) { 
    } 


    // And two methods from MouseMotionListener: 
    public void mouseDragged(MouseEvent e) { 
    Point p = e.getPoint(); 
    // System.err.println("mouse drag to " + p); 
    showStatus("mouse Dragged to " + p); 
    curX = p.x; 
    curY = p.y; 
    if (inDrag) { 
     repaint(); 
    } 
    } 

    public void paint(Graphics g) { 
    int w = curX - startX, h = curY - startY; 
    Dimension d = getSize(); 
    g.drawImage(curImage, 0, 0, d.width, d.height, this); 
    if (startX < 0 || startY < 0) 
     return; 
    System.err.println("paint:drawRect @[" + startX + "," + startY 
     + "] size " + w + "x" + h); 
    g.setColor(Color.red); 
    g.fillRect(startX, startY, w, h); 
    } 

} 
+2

-1 Bu temelde sorunun içindeki kodun bir kopyasıdır. Sorunu çözmez.) – finnw

6

(Alex'in ama biraz daha basit çok benzer) Başka bir geçici çözüm JFrame 'ın kök bölmesinden olaylara dinlemektir: Diğer uygulama ayrıntılarını bağlı

public final class TestFrame extends JFrame { 
    public TestFrame() { 
     this.getRootPane().addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       // This is only called when the user releases the mouse button. 
       System.out.println("componentResized"); 
      } 
     }); 
    } 
} 

, Kök bölmenin değişmiş olması olasıdır. Eğer bu bir olasılıksa, setRootPane()'u geçersiz kılabilir ve bununla başa çıkabilirdiniz. setRootPane() korunduğundan ve yalnızca yapıcıdan çağrıldığından, bunu yapmanız gerekmiyor.

+0

Kamuoyu yok TestFrame() {'...? –

+2

@AnnonomusPenguin, hayır, bu bir yapıcı beyanı, ve kurucular 'void' gibi dönüş türlerini belirtmezler. –

İlgili konular