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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTree - использование JRadio в качестве листов 
:(
    Опции темы
dsCode
Дата 21.9.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



Привет всем =) В Java я новичок (в основном занимаюсь PHP и JavaScript). Вопрос по деревьям в Swing'e. Я пишу систему тестирования, так вот, мастер создания тестов представляет создание теста в виде дерева (первый уровень - название теста, второй - вопросы теста, третий - варианты ответов на вопросы).

Структура дерева:

Код

Тест "Название теста"
  |
  |___1. Первый вопрос
  |  |
  |  |___1.1 Вариант ответа#1
  |  |
  |  |___1.2 Вариант ответа#2
  |
  |___2. Второй вопрос
     |
     |___2.1 Вариант ответа#1
     |
     |___2.2 Вариант ответа#2 


Вопросы:

1. Как получить порядковый номер чайлда в узле? Я добавляю номера вопросов (ну здесь просто - использую "getChildCount() + 1"). А в случае с вариантами ответов ("1.1", "1.2" и т.д.) - если верхние узлы закрыты, то для нижних добавляется правильно (например, "2.1", "2.2"), но если в первый вопрос было добавлено два варианта ответа и узел вопроса раскрыт, то добавляется "4.1", "4.2". Я использовал "getLeadSelectionRow()" и "getRowCount()" - все равно Sad Как мне, зная узел, получить правильные порядковый номер, УЧИТЫВАЯ ТОЛЬКО НУЖНЫЙ УРОВЕНЬ? Т.е., чтобы в дерево не представлялось, как линейный список и не считались вложенные ветви.

2. Самый главный вопрос: юзеру нужно будет выбрать номер правильного варианта ответа (только один). Естественно, варианты ответов должны добавляться радио-баттонами (и быть группой). Т.е. при добавлении первого варианта - сразу radio выбран, дальше добавляется второй вариант - радио - не активен, но его можно выбрать, чтобы указать, что этот вариант ответа в этом вопросе - правильный. Там что-то связанно с UserObject, но я не особо пока понял, что с ним сделать. 

Вот вырезка кода по работе с деревом:

Код

...

private JTree testTree = null;
private DefaultTreeModel testTreeModel = null;

...

  private void buildCreateTestSecondStep() {

    this.jWizardPane.setBorder(BorderFactory.createTitledBorder("Создание теста. Шаг 2 - ввод вопросов и вариантов ответов на них"));

    DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Тест: " + this.test.getTitle());

    DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
    renderer.setBackgroundNonSelectionColor(null);
    renderer.setBackgroundSelectionColor(null);
    renderer.setBorderSelectionColor(null);
   
    this.testTreeModel = new DefaultTreeModel(rootNode);
    this.testTree = new JTree(this.testTreeModel);
    this.testTree.setBackground(null);
    this.testTree.setBounds(10, 25, 456, 125);
    this.testTree.setCellRenderer(renderer);
    JScrollPane jTestTreeScrollPane = new JScrollPane(this.testTree);
    jTestTreeScrollPane.setBounds(10, 25, 456, 195);
    jTestTreeScrollPane.setBorder(BorderFactory.createTitledBorder("Структура теста: добавление вопросов и вариантов ответов"));
    this.jWizardPane.add(jTestTreeScrollPane, 0);

    JButton addButton = new JButton("Добавить");
    addButton.setBounds(10, 225, 100, 24);
    addButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            DSTestWizard.this.addNode();
          }
        });
      }
    });
    JButton removeButton = new JButton("Удалить");
    removeButton.setBounds(120, 225, 100, 24);
    removeButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            DSTestWizard.this.removeNode();
          }
        });
      }
    });

    this.jWizardPane.add(addButton, 0);
    this.jWizardPane.add(removeButton, 0);

    this.createStep++;

    this.refreshJPanel();
  }

    private void addNode() {
    DefaultMutableTreeNode parent = getSelectedNode();
    if (parent == null) {
      JOptionPane.showMessageDialog(DSTestWizard.this, "Выберите элемент", "Информация", JOptionPane.INFORMATION_MESSAGE);
      return;
    }
    System.out.println(parent.getLevel());
    if (parent.getLevel() == 2) {
      JOptionPane.showMessageDialog(DSTestWizard.this, "Нельзя добавить", "Информация", JOptionPane.INFORMATION_MESSAGE);
      return;
    }
    String name = JOptionPane.showInputDialog(DSTestWizard.this, "Введите название:"));
    if (name != null && !name.equals("")) {
      String number = "";
      if (parent.getLevel() == 0) {
        number = Integer.toString(parent.getChildCount() + 1); 
      } else {
        number = this.testTree.getRowCount() + "." + (parent.getChildCount() + 1);
      }
      String nodeName = number + ". " + name;
      DefaultMutableTreeNode child = new DefaultMutableTreeNode(nodeName);
      if (parent.getLevel() == 1) {
        child.setAllowsChildren(false);
        //child.setUserObject(new JCheckBox("Test").getClass().getText());
      }
      this.testTreeModel.insertNodeInto(child, parent, parent.getChildCount());
    }

  }

  private void removeNode() {
    DefaultMutableTreeNode selectedNode = getSelectedNode();
    if (selectedNode != null && selectedNode.getLevel() != 0) {
      this.testTreeModel.removeNodeFromParent(selectedNode);
    }
  }

  private DefaultMutableTreeNode getSelectedNode() {
    return (DefaultMutableTreeNode) this.testTree.getLastSelectedPathComponent();
  }


Заранее спасибо всем, кто ответит.

P.S.: оффтоп - опечатался в названии темы, исправьте, пожалуйста: "в кажестве" -> "в качестве"

Это сообщение отредактировал(а) dsCode - 21.9.2007, 16:59


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 21.9.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(dsCode @  21.9.2007,  16:45 Найти цитируемый пост)
1. Как получить порядковый номер чайлда в узле? Я добавляю номера вопросов (ну здесь просто - использую "getChildCount() + 1"). А в случае с вариантами ответов ("1.1", "1.2" и т.д.) - если верхние узлы закрыты, то для нижних добавляется правильно (например, "2.1", "2.2"), но если в первый вопрос было добавлено два варианта ответа и узел вопроса раскрыт, то добавляется "4.1", "4.2". Я использовал "getLeadSelectionRow()" и "getRowCount()" - все равно Sad Как мне, зная узел, получить правильные порядковый номер, УЧИТЫВАЯ ТОЛЬКО НУЖНЫЙ УРОВЕНЬ? Т.е., чтобы в дерево не представлялось, как линейный список и не считались вложенные ветви.


не надо порядковый номер если добавлять в выделенный узел.
примерно:
Код

 public void addNode()
 {
    //получаем имя выделенного нода
  DefaultMutableTreeNode node=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
  Object o=node.getUserObject();
  String nodeName=o.toString();

    //получаем номер нода из имени(в твоем случае подойдет до точки 
    //и исключаем самых младших детей и самого старшего родителя)
  if(!nodeName.equals("Test") && (node.getParent().toString()).equals("Test"))
  {
   int x=nodeName.indexOf('.');
   String nodeNumber=nodeName.substring(0,x);
   int number=Integer.parseInt(nodeNumber);//это необязательно

    //делаем новый нод
   DefaultMutableTreeNode newNode=new DefaultMutableTreeNode
     (number+"."+(node.getChildCount()+1)+" variant#"+(node.getChildCount()+1));
   node.insert(newNode,node.getChildCount());
  }
 }


Это сообщение отредактировал(а) dorogoyIV - 22.9.2007, 00:51
PM MAIL   Вверх
dorogoyIV
Дата 22.9.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(dsCode @  21.9.2007,  16:45 Найти цитируемый пост)
2. Самый главный вопрос: юзеру нужно будет выбрать номер правильного варианта ответа (только один). Естественно, варианты ответов должны добавляться радио-баттонами (и быть группой). Т.е. при добавлении первого варианта - сразу radio выбран, дальше добавляется второй вариант - радио - не активен, но его можно выбрать, чтобы указать, что этот вариант ответа в этом вопросе - правильный. Там что-то связанно с UserObject, но я не особо пока понял, что с ним сделать. 


а зачем группы радио_баттон?
пишешь в конструкторе:
Код

  DefaultTreeSelectionModel model=new DefaultTreeSelectionModel();
  model.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
  tree.setSelectionModel(model);
//возможно выделить только один нод

ну и опять же получаешь имя выделенного нода и т.д. ...
PM MAIL   Вверх
dsCode
Дата 22.9.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



dorogoyIV, спасибо за ответ. По первому вопросу - значит нет определенного свойства и метода, только substring'ом.. Угу.. Но все равно, спасибо - тоже способ, сделаю, пожалуй, так =)

А насчет второго - выделять-то понятно, что можно будет только один лист, но здесь нужно чтобы юзер видел признак правильного варианта ответа. Во всех раскрытых нодах у листьев должна стоять "галочка", что именно этот вариант верный. Самый правильный вид был бы с радио-баттонами. А вот можно ли такое сделать... Думаю да - по части просто добавления радио-баттонов, но ситуация осложняется тем, что радио должны быть группой.


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 23.9.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



в общем не получилось у меня засунуть в дерево чекбокс или радиобаттон. зато иконку легко.
ну можно на иконке нарисовать то, что нужно (например галочку или кружочек как в радио  smile ), и обрабатывать дальше...
PM MAIL   Вверх
dsCode
Дата 23.9.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



dorogoyIV, c чекбоксами видел реальный пример, чуть позже найду ссылку. По аналогии можно и радио запихать, наверное (только, опять же, повторю - как их сделать группой потом еще?). А насчет иконок - тоже идея! Если можно менять динамически иконку (ведь можно, правда? или я ошибаюсь?) - то в событии по выделению нода - снимать "выделенную иконку" у предыдущего листа и ставить ее к новому выделенному, а старому ставить прозрачную (ну и куда-то записывать признак правильности варианта по текущему вопросу). Thx =)


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 23.9.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



не знаю почему тебя так пугает сделать группу?

кстати напомню, ButtonGroup объединяет радио только логически. значит при добавлении или удалении надо делать два действия - добавлять/удалять 1.в группу и 2.на панель .
PM MAIL   Вверх
dsCode
Дата 23.9.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



dorogoyIV, да нет же, объединение радио-баттонов в группу меня вовсе не пугает. Речь идет о том, что эти радио - листья дерева. Т.е. что это должно означать: при добавлении чайлд-нода - добавляется радио или же - сначала формируется группа, содержащая радио и потом уже эта группа добавляется как единственный нод. В общем, вот это как-то не понятно.

хм.. а альтернативу можно найти? например, таблицы (JTalbe)? - там можно несколько уровней делать (первый уровень - вопросы, второй - варианты ответов)? В сущности - тоже дерево, только в табличном виде, этакий outline =)

Это сообщение отредактировал(а) dsCode - 23.9.2007, 14:51


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dsCode
Дата 25.9.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



научился я делать радио-баттонами листья, но похоже, не удастся реализовать задумку :( Всплыла еще одна проблема: одиночный выбор. Нужно делать так, чтобы, если на третьем уровне выбран нод (радио-баттон), то он так и должен остаться выбранным (выделенным). Из-за одиночного выделения - кликаем на втором уровне - выделение (признак правильности) на третьем уровне снимается. Более того, нужно, чтобы на третьем уровне в разных группах оставалось свое выделение, т.е. выделили в первом вопросе правильный вариант, потом - во втором - и все это должно быть обычным кликом - без Shift'ов и Ctrl'ов (если говорить о мульти-выборе). Вообще, подошел бы мульти-выбор, если была бы возможность задать его только для определенного уровня (для третьего). Того я думаю, может можно сэмитировать нажатие Shift'a или Ctrl'a при выборе в другой группе. Это возможно вообще?


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 26.9.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



так ты наверное все в одну баттонгруппу добавил? надо для каждого узла с детями свою группу делать из этих детей.
PM MAIL   Вверх
dsCode
Дата 26.9.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



dorogoyIV, и что это будет означать? Что узел имеет одного чайлда - группу (в которой 4 радио), а не четыре? Чайлды добавляются динамически - т.е. радио-баттон появляется сразу. Т.е. предварительно перед добавлением первого чайлда - добавить единственного чайлда - группу и уже потом добавлять в эту группу радио, так? Интересно, это вообще возможно? В смысле, добавить JButtonGroup чайлдом в нод.. Если да, то - это будет единственный чайлд нода, а при добавлении вариантов ответов - брать этого чайлда и делать ему уже add(...), добавляя радио в группу.  


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 26.9.2007, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Тест "Название теста"
  |
  |___1. Первый вопрос
  |  |
  |  |___1.1 Вариант ответа#1
  |  |
  |  |___1.2 Вариант ответа#2
  |
  |___2. Второй вопрос
     |
     |___2.1 Вариант ответа#1
     |
     |___2.2 Вариант ответа#2 

я имею ввиду - в первой группе будут "1.1 Вариант ответа#1, 1.2 Вариант ответа#2"
                         во второй "2.1 Вариант ответа#1, 2.2 Вариант ответа#2"
если добавлять "1.3 Вариант ответа#3" , то его надо будет добавить в первую группу

группа только логически объединяет радио баттоны, она их не рисует на экране
PM MAIL   Вверх
dsCode
Дата 26.9.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: нет
Всего: 26



dorogoyIV, да, только дело в том, что добавляются не радио-баттоны (вернее, радио-баттоны, но не в классическом виде). Реализована своя имплементация интерфейса TreeCellRenderer, где сказано, что вид листье - радио-баттоны, но они остаются листьями. Хотя....... при добавлении вопроса - создавать параллельно группу (не связанную с деревом) и пытаться добавить эти "литья" в группу (параллельно с добавлением в дерево).. Не знаю, можно будет так или нет (все таки это не просто радио-баттоны, а листья) - но попробую. Спасибо за совет! =)

Это сообщение отредактировал(а) dsCode - 26.9.2007, 14:31


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

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

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


 




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


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

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