Wykrycie zmiany rozmiaru okienka - nie działa tak jak chcę

0

Cześć

Próbuję wykryć zmianę rozmiaru okienka myszą. Aplikacja wykrywa to, ale mam problem.

Najpierw tworzę klasę:

public class myFrame extends JFrame implements ComponentListener

Potem dodaję ComponentListener dla okna:

this.addComponentListener(this);

Na końcu metoda:

@Override
public void componentResized(ComponentEvent e)
{
    JOptionPane.showMessageDialog(panelText, e.getComponent().getClass().getName() + "Resized");
}

Zaraz po uruchomieniu i za każdym razem gdy chcę zmienić rozmiary okienka wyświetlana jest cała masa okienek że są zmieniane wymiary okienka. I nie mogę zmienić rozmiarów bo za każdym razem wyświetlane są komunikaty.
Co zrobić żeby tylko jeden komunikat pojawił się dopiero jak już skończę zmieniać myszą wymiary (puszczę przycisk myszy)?

0

Wyrzucane są zdarzenia zmiany rozmiaru okna w czasie jego zmiany ponieważ takie masz domyślne opcje w systemie (przy zmianie rozmiaru takim jak z Windows 95 lub na niektórych Linuksach, gdzie mysz przesuwa tylko ramkę, pojawia się tylko jedno zdarzenie po jej zatwierdzeniu).
Po prostu zamiast sztywnego wyrzucania dialogu zapisuj sobie kolejne zmiany (tylko ostatnią) i okno wyświetl dopiero kiedy pojawią się jakieś inne zdarzenia myszą na dowolnym komponencie wewnątrz okna (np. MouseEnter, MouseExit) lub timerem po ustalonym sobie timeoucie (1-2 sekundy) jeżeli żadnego innego eventu od myszy nie dostaniesz.

Pamiętaj, że ramka okna top-level jest obiektem ciężkim, czyli w ogóle poza kontrolą twojej aplikacji, a nawet poza kontrolą JVM, więc nie przechwycisz zdarzeń myszy powodujących zmianę rozmiaru tego okna w jego trakcie inaczej niż przez hak na system. Te zdarzenia, które otrzymuje Java są zdarzeniami wtórnymi - już po fakcie zmiany rozmiaru.

0

Dzięki za odpowiedź.

Jest trochę roboty z tym, przyznam się że nie jestem ekspertem od Javy i mogłyby być problemy.

Ale chyba jednak zostawię to tak jak jest. Po prostu chciałem wykrywać zmiany rozmiarów okienka żeby zastosować to do dynamicznej zmiany niektórych kontrolek względem całego okna i kilku innych rzeczach. Także kontrolki będą się zmieniać w każdym momencie zmiany rozmiaru okienka.
Chciałem zrobić to prostym sposobem tylko po puszczeniu przycisku myszy żeby program nie zajmował za dużo zasobów, tylko jeden raz zmieniał rozmiary komponentów, ale da się z tym żyć.

Dzięki za zainteresowanie.

0

Potrzebowałem kiedyś JLabel, w którym wielkość czcionki zależała od wielkości okna. Poniższy kod radził sobie dobrze.

public void componentResized(ComponentEvent ev)
{
    int w = label.getWidth();
    int h = label.getHeight();
    AffineTransform at = new AffineTransform(0.9*w/width,0.0f,0.0f,0.9*h/height,0.0f,0.0f);
    Font newFont = font.deriveFont(at);
    label.setFont(newFont);
}

width i height, to pierwotny rozmiar labela.

0

Wygląda mi na to, że chcesz odtylcem zrobić funkcjonalność layoutManagera bez LM.
Pytanie tylko: Po co?
Podepnij zwyczajnie odpowiedniego LM i gotowe. Jeśli nie chcesz bawić się myśleniem nad zależnościami, to wyklikaj panel z kontrolkami z jakiegoś buidera i podepnij wygenerowane śmiecie z palca. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1