Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTabbedPane двойной клик по закладкам 
V
    Опции темы
Platon
Дата 8.2.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 4
Всего: 40



Здравствуйте, уважаемые.

Не смекну, как мне обработать события на вкладках JTabbedPane. В частности меня интересует сценарий, чтобы двойным щелчком по вкладке закрывать ее, как в аськах Miranda, Qip и еще много где.

Прошу помочь.

Добавлено через 3 минуты и 15 секунд
про кнопочку закрытия на каждой вкладке я просто не упоминаю, читал, что там проблемы с развертыванием компонента на всю вкладку.
PM MAIL ICQ   Вверх
w1nd
Дата 8.2.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 23
Всего: 54



Цитата(Platon @  8.2.2008,  16:55 Найти цитируемый пост)
Не смекну, как мне обработать события на вкладках JTabbedPane.

Для java 6 должно хватить обработчика мыши на компоненте, используемом в закладке.

Цитата(Platon @  8.2.2008,  16:55 Найти цитируемый пост)
про кнопочку закрытия на каждой вкладке я просто не упоминаю, читал, что там проблемы с развертыванием компонента на всю вкладку.

Эту проблему можно легко решить с помощью патча (исправленный BasicTabbedPaneUI в bootclasspath). Этот способ для вас приемлем?


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
dorogoyIV
Дата 9.2.2008, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Platon @  8.2.2008,  16:55 Найти цитируемый пост)
Не смекну, как мне обработать события на вкладках JTabbedPane. В частности меня интересует сценарий, чтобы двойным щелчком по вкладке закрывать ее, как в аськах Miranda, Qip и еще много где.

да ты наверное и не пробовал, признавайся  smile 
все ж легко и просто:
Код

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class TabbedPanes extends JFrame
                  implements MouseListener,
                             ActionListener
{
 JTabbedPane tabbedpane;
 JButton jb;

 TabbedPanes()
 {
  setBounds(100,100,400,300);

  tabbedpane=new JTabbedPane();
  tabbedpane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
  add(tabbedpane);
  tabbedpane.addMouseListener(this);

  jb=new JButton("addTab");
  add(jb, "South");
  jb.addActionListener(this);
 }

 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}
 public void mousePressed(MouseEvent e){}
 public void mouseReleased(MouseEvent e){}
 public void mouseClicked(MouseEvent e)
 {
  if(e.getClickCount() == 2 && tabbedpane.getTabCount() > 0)
  {
   tabbedpane.remove(tabbedpane.getSelectedIndex());
  }
 }

 public void actionPerformed(ActionEvent e)
 {
  tabbedpane.addTab(null,
       new JSplitPane(JSplitPane.VERTICAL_SPLIT,
       new JScrollPane(new JTextArea()),
       new JScrollPane(new JTextArea())));

  for(int i=0; i < tabbedpane.getTabCount(); i++)
  {
   tabbedpane.setTitleAt(i, (i+1)+"");
  }
 }

 public static void main(String [] args)
 {
  try
  {
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
   JFrame f=new TabbedPanes();
   f.setVisible(true);
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  catch(Exception ex){}
 }
}



PM MAIL   Вверх
Platon
Дата 9.2.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 4
Всего: 40



dorogoyIV, нет, не подловил ты меня. Дело в том, что, если кликаешь справа от закладок, т.е. жмакаешь по JTabbedPane, закрывается выделенная, но по идее не должна закрываться никакая! В этом проблема. Прошу прощения, что забыл упомянуть способы которые я перепробовал. Ну собственно, его только я и придумал, но не совсем подходит.

Добавлено через 1 минуту и 3 секунды
w1nd, можно поподробней? Я искал такой способ, но примеров так и не нашел.
PM MAIL ICQ   Вверх
dorogoyIV
Дата 9.2.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Platon @  9.2.2008,  10:15 Найти цитируемый пост)
 Дело в том, что, если кликаешь справа от закладок, т.е. жмакаешь по JTabbedPane, закрывается выделенная, но по идее не должна закрываться никакая!

ну это можно обойти:
Код

 public void mouseClicked(MouseEvent e)
 {
  Rectangle r=new Rectangle(0, 0, 0, 0);
  Point p=e.getPoint();

  if(e.getClickCount() == 2 && tabbedpane.getTabCount() > 0)
  {
   int x=0;

   for(int i=0; i < tabbedpane.getSelectedIndex(); i++)
   {
    r = tabbedpane.getBoundsAt(i);
    x +=r.width;
   }
   if(p.x >= r.x && p.x <= r.width + x)
   {
    tabbedpane.remove(tabbedpane.getSelectedIndex());
   }
  }
 }

правда с первым табом не работает, но я думаю и это обойдешь уже сам

Цитата

про кнопочку закрытия на каждой вкладке я просто не упоминаю, читал, что там проблемы с развертыванием компонента на всю вкладку.

в шестой версии проблемы решены

Это сообщение отредактировал(а) dorogoyIV - 9.2.2008, 13:43
PM MAIL   Вверх
Platon
Дата 9.2.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 4
Всего: 40



Я всё таки подожду более элегантное решение.
PM MAIL ICQ   Вверх
w1nd
Дата 10.2.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 23
Всего: 54



В BasicTabbedPaneUI есть такой кусок кода:
Код
    //centralize component
    int x = outerX + (outerWidth - preferredSize.width) / 2;
    int y = outerY + (outerHeight - preferredSize.height) / 2;
    int tabPlacement = tabPane.getTabPlacement();
    boolean isSeleceted = i == tabPane.getSelectedIndex();
    c.setBounds(x + getTabLabelShiftX(tabPlacement, i, isSeleceted),
                y + getTabLabelShiftY(tabPlacement, i, isSeleceted),
           preferredSize.width, preferredSize.height);

Исправляем:
Код
    //do not centralize component
    int tabPlacement = tabPane.getTabPlacement();
    boolean isSeleceted = i == tabPane.getSelectedIndex();
    c.setBounds(outerX + getTabLabelShiftX(tabPlacement, i, isSeleceted),
                outerY + getTabLabelShiftY(tabPlacement, i, isSeleceted),
           outerWidth, outerHeight);

Теперь только подложить этот класс или архив с ним в папку jre endorsed или подключать в свой classpath с помощью ключа -Xbootclasspath/p: А после этого первый вопрос решается обычным слушателем для компонента таба. Работает, конечно, только для java 6. Есть очень извращённый способ решения проблемы без патча, но он тоже будет работать только в java 6; в более ранних версиях - только своя реализация TabbedPaneUI.

Это сообщение отредактировал(а) w1nd - 10.2.2008, 00:49


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Platon
Дата 19.2.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 4
Всего: 40



dorogoyIV, спасибо за пищу для ума, всё таки не понял я к чему такое нагромождение, но ключевые моменты мне помогли. Я в итоге сделал проще.

Код

    private void tryCloseSelectedTab(int x, int y) {
        Rectangle r = chatPane.getBoundsAt(chatPane.getSelectedIndex());
        if (r != null && r.contains(x, y)) {
            removePane(users.get(chatPane.getSelectedIndex()));
        }
    }

PM MAIL ICQ   Вверх
dorogoyIV
Дата 19.2.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Platon @  19.2.2008,  12:24 Найти цитируемый пост)
 к чему такое нагромождение

да просто из своего другого кода вытащил не думая  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.