SWING - kilka pytań

0

Witam.
Napisałem sobie program, w którym głównym elemenem jest JTree, które w gałęziach posiada JTable. JTree ma własny model (extends DefaultTreeModel) edytor (extends DefaultTreeCellEditor), renderer (extends DefaultTreeCellRenderer). eytor jak i renderer jest potrzebny do wyrysowania JTable. JTable natomiast posiada własny model(extends AbstractTableModel).
Mam kilka problemów.

Jeżeli dodam tabelke do drzewa, to mimo ze zawiera tylko jeden rzad, scroll zajmuje duzo duzo wiekszy obszar niz jest to konieczne(wysokosc). Dlatego w rendererze drzewa, w metodzie getTreeCellRendererComponent zwracam JScrollPane z tabelka. A dla tego scrolla ustawiam wartosci:

scroll.setPreferredSize(new Dimension(scroll.getPreferredSize().width, table.getRowHeight()*(table.getModel().getRowCount()+1)+3));

Dzięki temu wysokość zawsze jest dopasowana do ilości wierszy w tabelce.

  1. Jeżeli teraz rozszeze okno, szerokość tabelki nie ulega zmianie. Co powinienem zmienic, aby szerokość tabelki zajmowaął cały panel w którym sie znajduje drzewo? Wygląda to tak, jaby JTree nie wykozystywało całej szerokości. JTable jest w JTree a ono jest w JPanel.

Do drzewa, jak i tabelki mam dodane mouseListenery (Obsluga prawego przycisku myszki). Jeżeli rozwine gałąź tak, aby było widać tabelke, i klikne na nia PPM, to wywołuje mi sięlistener dla Drzewa. Aby wywołac listenera dla tabelki, najpierw musze na nią kliknąć LPM(aby dostałą focusa).
2. Jak zrobic, aby od razu po kliknieciu PPM na tabelce wywołał sie listener dla tabelki a nie dla drzewa?

Mam rozwiniętą gałąź i wyświetloną tabelke. Jeżeli do tabelki dodam kolejny rząd, to wyświetla mi sie tabelka z poprzednia iloscia wierszy oraz z pionowym scrolem. Jak zdejme focusa z tabelki, a następnie znowu na nia klikne, wyświetla się tabelka ze wszystkimi rzędami bez scrola. Sytuacja jest podobna kiedy rzadu usune. Zostaje puste miejsce pod spotme tabeli. W edytorze w metodzie getTreeCellEditorComponent rowniez zwracam scrola z tabelka

s.setPreferredSize(new Dimension(s.getPreferredSize().width, t.getRowHeight()*(t.getModel().getRowCount()+1)+3));
  1. Co zrobic, aby od razu po dodaniu wiersza pojawiły sie wszystkie rzedy bez scrola?

Perwszym elementem drzewa jest Root, z którego wychodza kolejne gałęzie. Można zwinąć roota, a wtedy wszystkie gałęzie beda niewidoczne(czyli standard). Chciałbym, aby root nie był wyświetlany. Jeżeli zrobie tree.setRootVisible(false); a nastepnie dodam jakies gałezie, nie mam jak ich rozwinac, a co za tym idzie nie moge och obejrzec.
4. Jak bez wyświetlania roota wyświetlaćgałęzie od niego wychodzące?

Z góry dzięki za odpowiedzi albo podpowiedzi

0

Na 4 pytanie znalazłem odpowiedź. po prostu rozwijam i zwijam gałąź.
Naprawde nie ma nikt pomysłu na pozostałe problemy?

0

ad.1 Odpowiedź masz już zawartą w pytaniu. Dokładnie "Jeżeli teraz rozszerzę okno". Musisz obsłużyć zdarzenie zmiany rozmiaru okna i w jego efekcie spowodować zmianę rozmiaru tego co się w nim znajduje czyli drzewa i tabelki. Bez sprawdzania pierwsze czym bym się zainteresował, to validate().

ad.2 Pierwszy sposób, to przekazanie zdarzenia do dziecka czyli tabelki w której obrębie znalazł się kursor myszy. Można to wykonać za pomocą takich metod jak SwingUtilities.getDeepestComponentAt(), SwingUtilities.convertPoint() i Component.dispatchEvent(). Drugim sposobem jest obsłużenie przez tabelkę takich zdarzeń jak Mouse Enter i Mouse Exit powodujące samoczynne ustawianie focusa na niej i tracenie go na wyjściu z obszaru tabelki. Wtedy wybór ppm zawsze zadziała dla tabelki bo będzie ona miała focusa zawsze gdy kursor myszy będzie w jej obrębie. Tak działa wiele komponentów znajdujących się w innych pojemnikach.

ad.3 To samo co w przypadku pytania nr 1, tyle, że dla tabelki, a nie okna. Po prostu musisz poinformować menedżera układu drzewa, że powinien ponownie przeliczyć rozmiary wszystkich komponentów. Czyli odpalić invalidate() na tabelce i ewentualnie validate() na pojemniku, którego elementy mogły zmienić rozmiary czyli tutaj JTree().

0

Joł
Ad2. Jednak musiał zakodzic to "ręcznie". Tj. jak klikaem prawym na tabelke , to SwingUtilities.getDeepestComponentAt() i tak zwracało zawse komponent drzewa. Mouse Enter i MouseExit działało wtedy, kiedy tabelka miałą focusa, wiec ten sposób tez sie nie sprawdził. Ale Samemu sprawdzałem, czy to tabelka czy nie i przekazwyałem eventa do tabelki.

Wielkie dzieki za sugestie.

Co do punktu 1 i 2 próbowałem z validate, revalidate , invalidate, nawet z repaint :P , ale niestety nic sie nie resizowało ;(

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