2013-03-30 6 views
2

Я работаю над созданием undecorated JFrame, поэтому мне нужен способ изменить положение окна. Пока я могу сделать окно, следуя мыши, но я не могу остановить его. Я добавил ActionPerformed к JButton:Знайте, была ли нажата мышь без прослушивателя, или другой подход

test = true; 
while (test) { 
    setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20); 
} 

Смещения там держать указатель внутри JButton, который графически выглядит нажатой в течение while. Он творит чудеса, очень быстро. Но я не знаю, как остановить его. Я попытался добавить MouseClicked, который устанавливает test в false, но это не сработало. По-видимому, ни один прослушиватель не работает во время цикла.

Есть ли способ узнать, была ли нажата мышь внутри этого while? Итак, без слушателя или события? Или есть другой подход к переустановке окна?

Edit:

Еще раз спасибо Jurgen Камильрайте, но я хотел бы добавить модифицированную версию своего примера, который я считаю, это проще, содержащей едва необходимые вещи, чтобы сделать эту работу.

package testbench; 

import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class DraggableFrame 
extends JFrame 
implements MouseListener, MouseMotionListener { 

    static Point dragged = null; 
    static Point pressed = null; 

    public DraggableFrame() throws HeadlessException { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     setBounds(0, 0, 320, 240); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setUndecorated(true); 
    } 

    public static void main (String args[]) {   
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DraggableFrame().setVisible(true); 
      } 
     }); 
    } 

    @Override 
    public void mouseClicked (MouseEvent e) {} 

    @Override 
    public void mouseDragged (MouseEvent e) { 
     dragged = e.getLocationOnScreen(); 
     setLocation(
     (int)(dragged.getX() - pressed.getX()), 
     (int)(dragged.getY() - pressed.getY())); 
    } 

    @Override 
    public void mouseEntered (MouseEvent e) {} 

    @Override 
    public void mouseExited (MouseEvent e) {} 

    @Override 
    public void mouseMoved (MouseEvent e) {} 

    @Override 
    public void mousePressed (MouseEvent e) { 
     pressed = e.getPoint(); 
    } 

    @Override 
    public void mouseReleased (MouseEvent e) {} 
} 

Не обращайте внимания на пустые переопределенные методы, они необходимы. В реальной программе, которую я разрабатывал, я использовал отдельный класс для слушателей, который работает так же хорошо. Кроме того, не имеет значения, реализуете ли вы Listener или расширяете адаптер. С одной стороны, вы можете реализовать оба интерфейса. С другой стороны, вам не нужно переопределять все методы расширенного абстрактного класса.

Также этот метод работает, если вы добавляете слушателей в контейнер вашего фрейма. Однако он будет вести себя так, как если бы этот контейнер находился в (0, 0). Вам нужно будет добавить некоторые смещения на setLocation().

+0

Я хотел сказать: «Привет» перед текстом, но в первом и представить в двух правок, которые я сделал, что линия исчезла. У людей SO добавлен код для удаления «Привет? – GuiRitter

+1

Основная проблема заключается в том, что ваш цикл внутри события Dispatching Thread, который предотвратит обработку любых новых событий (или перерисовки) – MadProgrammer

+0

@MadProgrammer Я не уверен в том, что вы перекраины, потому что, как я уже сказал, моя первая попытка работал хорошо, так как в рамке перемещался с помощью мыши, но спасибо за информирование о событиях. – GuiRitter

ответ

1

Попробуйте это:

public class UndecoratedJFrame extends JFrame { 

    Point origin; 
    Point origin2; 

    public UndecoratedJFrame() { 
     setUndecorated(true); 
     initComponents(); 

     setVisible(true); 
    } 

    private void initComponents() { 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
       formMousePressed(evt); 
      } 
     }); 

     addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseDragged(java.awt.event.MouseEvent evt) { 
       formMouseDragged(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 400, Short.MAX_VALUE) 
     ); 

     layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    }      

    private void formMouseDragged(java.awt.event.MouseEvent evt) {         
     origin2 = new Point(evt.getLocationOnScreen()); 
     setLocation((int)(origin2.getX() - origin.getX()), (int)(origin2.getY() - origin.getY())); 
    }         

    private void formMousePressed(java.awt.event.MouseEvent evt) {         
     origin = new Point(evt.getPoint()); 
    } 
} 
+0

Да! Работает отлично и очень просто. Спасибо за вашу помощь! – GuiRitter

2

поэтому мне нужен способ изменить положение окна.

Для другого подхода Moving Windows.

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