2012-05-31 1 views
0
void NewJDialogcallone(JFrame frame) 
{ 
    location = frame.getLocationOnScreen(); 
    int x = location.x; 
    int y = location.y; 
    dialog.setLocation(x, y); 
    dialog.setLocationRelativeTo(frame); 
    dialog.setVisible(true); 
    dialog.setAlwaysOnTop(true); 
    dialog.addComponentListener(this); 
} 

public void componentMoved(ComponentEvent e,?????) 
{ 
    JOptionPane.showConfirmDialog (null, 
           "This is the \"Ok/Cancel\"message dialog box.", 
           "", 
           JOptionPane.OK_CANCEL_OPTION); 
} 

Я хочу использовать объект фрейма, чтобы диалоговое окно перемещалось относительно родительского фрейма, иначе я перемещаю родительский фрейм, и диалоговое окно перемещается вместе с ним. Я хочу позвонить dialog.setLocationRelativeTo(//parent frame object//), что возможно только в том случае, если у меня есть родительский объект кадра.Пропустить 2 объекта в ComponentListener и те объекты

Если есть способ получить это поведение в окне, пожалуйста, помогите мне.

ответ

2

Вам просто нужно добавить ключевое слово final перед параметром метода JFrame frame.

void NewJDialogcallone(final JFrame frame) 
... 

Я также рекомендовал бы, чтобы избежать использования этого:

dialog.setAlwaysOnTop(true); 

, потому что это действительно раздражает для пользователей. Как правило, это знак того, что вы неправильно создали свой диалог, т. Е. Передав правильного владельца Frame/Dialog.

Ниже приведен пример синхронизации окна местоположения и без использования setAlwayOnTop():

import java.awt.Point; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Test { 

    protected void initUI() { 
     final JFrame frame = new JFrame(); 
     frame.setTitle("Test dialog synch"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      // On the next line I pass "frame" to the dialog so that the dialog never 
      // goes behind the frame, avoiding the need for setAlwaysOnTop 
     final JDialog dialog = new JDialog(frame, false); 
     dialog.setSize(200, 50); 
     frame.addComponentListener(new ComponentAdapter() { 

      private Point lastLocation; 

      @Override 
      public void componentMoved(ComponentEvent e) { 
       if (lastLocation == null && frame.isVisible()) { 
        lastLocation = frame.getLocation(); 
       } else { 
        Point newLocation = frame.getLocation(); 
        int dx = newLocation.x - lastLocation.x; 
        int dy = newLocation.y - lastLocation.y; 
        dialog.setLocation(dialog.getX() + dx, dialog.getY() + dy); 
        lastLocation = newLocation; 
       } 
      } 

     }); 
     frame.setSize(400, 200); 
     frame.setVisible(true); 
     dialog.setLocationRelativeTo(frame); 
     dialog.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().initUI(); 
      } 
     }); 
    } 

} 
+0

dialog.setAlwaysOnTop (истина); держит диалоговое окно над рамкой. Я хочу, чтобы это препятствовало поведению, когда при перемещении кадра (родительского кадра) поле Jdialog перед родительским фреймом также должно перемещаться и располагаться относительно кадра. Можете ли вы предложить мне что-то там? –

+0

@ user1428216 Обновите свой ответ с помощью полностью работающего примера –

+0

Большое вам спасибо, это то, что я искал. Яркий ответ, который решил мою проблему. Я обещаю дать вам кредит, когда я отправлю это в любом месте, чтобы оплатить его. –

0

Вы можете легко создать компонент слушателя, какие ссылки любые объекты вам это нужно

final Object one = new Object(); 
    final Object two = new Object(); 

    ComponentListener listener = new ComponentListener() { 
     public void componentHidden(ComponentEvent e) { 
      one.toString(); 
     } 
     public void componentMoved(ComponentEvent e) { 
      two.toString(); 
     } 
     public void componentResized(ComponentEvent e) { 
      one.toString(); 
     } 
     public void componentShown(ComponentEvent e) { 
      two.toString(); 
     } 
    }; 

 Смежные вопросы

  • Нет связанных вопросов^_^