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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление компонентов в JTextPane, как добавить JButton в JTextPane 
:(
    Опции темы
JulT
Дата 29.9.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Так ты вызывай replaceSelection() только для того диапазона где стоит нужная кнопка:
Код
public static void main(String[] args) throws Exception
{
  JButton button1 = new JButton("My button 1");
  JButton button2 = new JButton("My button 2");
  JTextPane textPane = new JTextPane();
  textPane.setText("Abcd  efg hij klmnop qrst uvw xyz");
  textPane.setCaretPosition(5);
  textPane.insertComponent(button1);
  textPane.setCaretPosition(9);
  textPane.insertComponent(button2);

  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  frame.getContentPane().add(textPane);
  frame.pack();
  frame.setLocationRelativeTo(null);
  frame.setVisible(true);

  Thread.sleep(2000);

  textPane.setSelectionStart(5);
  textPane.setSelectionEnd(6);
  textPane.replaceSelection("");
}


Добавлено @ 12:22 
Я имел в виду в методе removeButton() вместо remove() вызывай replaceSelection(). Только для каждой кнопки придется помнить в какое место она вставлялась, для этого можно использовать например HashMap.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 29.9.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



а что записывать в HashMap, в качестве ключа кнопку,а в качестве значения что,там же получается 2 значения,одно начало кнопки,второе конец
PM MAIL   Вверх
LSD
Дата 29.9.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Создай класс для хранения позиции:
Код
public class ButtonPos
{
  public final String text;
  public final int start, end;

  public ButtonPos(String text, int start, int end)
  {
    if(text == null)
      text = "";
    this.text = text;
    this.start = start;
    this.end = end;
  }

  public boolean equals(Object o)
  {
    if(this == o)
      return true;
    if(o == null || getClass() != o.getClass())
      return false;

    final ButtonPos buttonPos = (ButtonPos) o;

    if(end != buttonPos.end)
      return false;
    if(start != buttonPos.start)
      return false;
    return text.equals(buttonPos.text);
  }

  public int hashCode()
  {
    int result = text.hashCode();
    result = 29 * result + start;
    result = 29 * result + end;
    return result;
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 29.9.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



простите,а вы бы могли чуточку пояснить как работают эти 2 метода,в кратце хотя бы:
Код

 public boolean equals(Object o)
  {
    if(this == o)
      return true;
    if(o == null || getClass() != o.getClass())
      return false;

    final ButtonPos buttonPos = (ButtonPos) o;

    if(end != buttonPos.end)
      return false;
    if(start != buttonPos.start)
      return false;
    return text.equals(buttonPos.text);
  }

  public int hashCode()
  {
    int result = text.hashCode();
    result = 29 * result + start;
    result = 29 * result + end;
    return result;
  }
 smile 
PM MAIL   Вверх
LSD
Дата 29.9.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



equals()
1. Проверяем тот же это самый объект или нет (это не обязательно, но в большинстве случаев повышает производительность)
Код
if(this == o)
  return true;

2. Проверяем что объект не null и того типа что и данный:
Код
if(o == null || getClass() != o.getClass())
  return false;

3. Приводим переданый объект к типу ButtonPos и сравниваем каждое поле:
Код
final ButtonPos buttonPos = (ButtonPos) o;

if(end != buttonPos.end)
  return false;
if(start != buttonPos.start)
  return false;
return text.equals(buttonPos.text);


hashCode() - возвращает некоторое число характеризующее данный объект, что-то наподобие контрольной суммы объекта. Только назначение другое, используется в объектах наподобие HashMap. В данном случае считаем ее как зависимость от хеш кодов всех полей объекта.

Эти два метода в основном используются в коллекциях. Сравнение объектов в коллекциях происходит с помощью метода equals(). А hashCode() используется классами HashtableHashMap и т.д. Есть одно правило, если для двух разных объектов equals() возвращает true, то и hashCode() должен возвращать одинаковое число. Обратное не обязательно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 29.9.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



ой спасибо вам огромное за пояснения smile ,только у меня еще вопросик,сразу же извиняюсь за глупость smile  smile ,как мне его использовать этот класс, эти объекты ButtonPos,нужно ли их хранить где-то еще,типа ArrayList какой-то
сорри
PM MAIL   Вверх
LSD
Дата 29.9.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Что-то наподобие такого:
Код
  private HashMap buttons = new HashMap();

  public void replaceText(JTextPane textPane)
  {
    ButtonPos pos = new ButtonPos(textPane.getSelectedText(), textPane.getSelectionStart(), textPane.getSelectionEnd());
    JButton button = new JButton(pos.text.trim());
    buttons.put(button, pos);
    textPane.insertComponent(button);
  }

  public void removeButton(JTextPane textPane, JButton button)
  {
    ButtonPos pos = (ButtonPos) buttons.get(button);
    textPane.setSelectionStart(pos.start);
    textPane.setSelectionEnd(pos.start + 1);
    textPane.replaceSelection(pos.text);
  }


Тут правда есть один момент: когда мы меняем текст, то положение кнопок меняется, и надо это как-то отслеживать. Пока я не знаю как это лучше сделать, но еще подумаю на эту тему.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 29.9.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



спасибо огромное за помощь,не все получается при удалении кнопок,текст вставляется на место кнопки между другим словом,но об этом уже в понедельник,а то у меня уже сил нет.
Спасибо еще раз LSD smile 
PM MAIL   Вверх
LSD
Дата 29.9.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Пожалуйста smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 1.10.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Вообщем вот, что у меня получилось:
Код
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;

public class TextFieldButton extends JFrame
{
  private JTextPane textPane;
  private HashMap buttonsMap;

  public TextFieldButton()
  {
    super("JTextField and JButton");

    buttonsMap = new HashMap();
    textPane = new JTextPane();
    String text = "abcdefghijklmnopqrstuvwxyz";
    textPane.setText(text);

    ActionListener listener = new RemoveButtonAction();
    for(int i = 0; i < textPane.getText().length() - 1; i += 3)
    {
      textPane.setSelectionStart(i);
      textPane.setSelectionEnd(i + 2);
      JButton button = new JButton("[" + textPane.getSelectedText().trim().toUpperCase() + "]");
      button.addActionListener(listener);
      buttonsMap.put(button, textPane.getSelectedText());
      textPane.insertComponent(button);
    }

    getContentPane().add(new JScrollPane(textPane));
  }

  public static void main(String[] args)
  {
    TextFieldButton t = new TextFieldButton();
    t.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    t.pack();
    t.setLocationRelativeTo(null);
    t.setVisible(true);
  }

  private class RemoveButtonAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      JButton button = (JButton) e.getSource();
      Point point = SwingUtilities.convertPoint(button.getParent(), button.getLocation(), textPane);
      int start = textPane.viewToModel(point);
      String text = (String) buttonsMap.get(button);
      textPane.setSelectionStart(start);
      textPane.setSelectionEnd(start + 1);
      textPane.replaceSelection(text);
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 2.10.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



спасибо большое,но тут есть один моментик.дело в том,что при нажатии на кнопочку,у меня должно появлятся другое окошко,а в данном случае она(конпка) исчезает,мне нужно,чтобы кнопка исчезала тогда,когда мы нажимаем правой клавишей на ней,потом вылазит менюшка,в которой я выбираю пункт убрать кнопку,вот,как такое сделать smile 
PM MAIL   Вверх
LSD
Дата 2.10.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Это совсем не сложно smile
Код
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import javax.swing.*;

@SuppressWarnings("unchecked")
public class TextFieldButton extends JFrame
{
  private JTextPane textPane;
  private HashMap buttonsMap;

  public TextFieldButton()
  {
    super("JTextField and JButton");

    buttonsMap = new HashMap();
    textPane = new JTextPane();
    String text = "abcdefghijklmnopqrstuvwxyz";
    textPane.setText(text);

    MouseListener listener = new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        if(e.getButton() != MouseEvent.BUTTON3)
          return;
        JButton button = (JButton) e.getComponent();
        JPopupMenu popupMenu = getPopupMenu(button);
        popupMenu.show(button, e.getX() + 1, e.getY() + 1);
      }
    };
    for(int i = 0; i < textPane.getText().length() - 1; i += 3)
    {
      textPane.setSelectionStart(i);
      textPane.setSelectionEnd(i + 2);
      JButton button = new JButton("[" + textPane.getSelectedText().trim().toUpperCase() + "]");
      button.addMouseListener(listener);
      buttonsMap.put(button, textPane.getSelectedText());
      textPane.insertComponent(button);
    }

    getContentPane().add(new JScrollPane(textPane));
  }

  public static void main(String[] args)
  {
    TextFieldButton t = new TextFieldButton();
    t.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    t.pack();
    t.setLocationRelativeTo(null);
    t.setVisible(true);
  }

  private void removeButton(JButton button)
  {
    Point point = SwingUtilities.convertPoint(button.getParent(), button.getLocation(), textPane);
    int start = textPane.viewToModel(point);
    String text = (String) buttonsMap.get(button);
    textPane.setSelectionStart(start);
    textPane.setSelectionEnd(start + 1);
    textPane.replaceSelection(text);
  }

  private JPopupMenu getPopupMenu(JButton button)
  {
    JPopupMenu popupMenu = new JPopupMenu("Remove menu");
    popupMenu.add(new RemoveButtonAction(button));
    return popupMenu;
  }

  private class RemoveButtonAction extends AbstractAction
  {
    private JButton button;

    public RemoveButtonAction(JButton button)
    {
      super("Remove button");
      this.button = button;
    }

    public void actionPerformed(ActionEvent e)
    {
      removeButton(button);
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 2.10.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



спасибо ОГРОМНОЕ ВАМ smile ,УРАААААААА.
А теперь наверное наступает самое сложное: я разобрала предложение, в нем находятся кнопочки, теперь мне всю эту структуру нужно где-то хранить,не знаю где,или в базе данных,или может в файле каком-то.
Надо чтобы когда пользователь выбрал просмотр,ему сразу же в JTextPane вставлялось это разобранное предложение со всеми кнопками и событиями для этих кнопок.Это вообще реально сделать
PM MAIL   Вверх
JulT
Дата 2.10.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

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



поробую сама разобраться,если что спрошу
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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