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

Поиск:

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


Шустрый
*


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

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



Вообще есть JTextPane в нем текст,выделяем слово в JTextPane ,при нажатии правой клавиши я сделала выпадающее меню,когда жмем на один из пунктов меню у меня заместь выделенного слова в JTextPane вставляется кнопка с названием этого слова.Таких кнопок получается несколько,на каждую из них я повесила обработчик события.Также,на каждую из этих кнопок я повесила другое выпадающее меню,в котором находится пункт,нажимая на который мне нужно чтобы кнопка удалялась,а на ее место вставлялось слово которое было до этого.Вопрос в следующем:1)как удалить нужную мне кнопку
2) нужно ли хранить все кнопки в отдельном массиве,для того чтобы с каждой в отделности можно было работать
3) где фиксировать координаты кнопки,потому что если не фиксировать,то выпадающая менюшка которая относится к кнопкам всегда вылазит только на последней созданной кнопке
Надеюсь поняли меня,ХЭЛП МИ ПЛИЗ
PM MAIL   Вверх
LSD
Дата 28.9.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



1. Название темы должно отражать ее суть!

2. 
Цитата(JulT @  28.9.2006,  17:21 Найти цитируемый пост)
1)как удалить нужную мне кнопку

textPane.remove(button)

3. 
Цитата(JulT @  28.9.2006,  17:21 Найти цитируемый пост)
2) нужно ли хранить все кнопки в отдельном массиве,для того чтобы с каждой в отделности можно было работать

Как-то их хранить завсисит от того как спроектировано приложение, вообщем это вполне приемлемый способ. Только лучше использовать не массив, а какая нибудь коллекцию, например ArrayList.

4. 
Цитата(JulT @  28.9.2006,  17:21 Найти цитируемый пост)
3) где фиксировать координаты кнопки,потому что если не фиксировать,то выпадающая менюшка которая относится к кнопкам всегда вылазит только на последней созданной кнопке

Код
Point location = button.getLocation();

Это координаты относительно JTextPane, с помощью класса SwingUtilities их можно сконвертировать в координаты относительно экрана или другого компонента.


--------------------
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
Дата 28.9.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не удаляет у меня он кнопку,делаю так:
Код

jTextPane2.addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
                pop=new JPopupMenu();
          if (e.getButton()==MouseEvent.BUTTON3) {
            Point p = e.getPoint();
                    JMenuItem menuItem4 = new JMenuItem("Сделать ключевым словом",new ImageIcon(CreateNewTest.class.getResource("img/l_rename.gif")));
                    pop.add(menuItem4).addActionListener(new ActionListener(){
                             public void actionPerformed(ActionEvent e){
                                    start=jTextPane2.getSelectionStart();
                                    end=jTextPane2.getSelectionEnd();
  button=new JButton(jTextPane2.getSelectedText().trim());
                button.setIcon(new ImageIcon(CreateNewTest.class.getResource("img/l_rename.gif")));
                button.setSize(jTextPane2.getSelectedText().trim().length(),8);
   //  а теперь тут создаю выпадающее меню,для только что созданной кнопки
   button.addMouseListener(new MouseAdapter(){
                  public void mouseClicked(MouseEvent q){
                     //System.out.println("1!!!!!!");
                       pop2=new JPopupMenu();
       if (q.getButton()==MouseEvent.BUTTON3) {
           p3 = q.getPoint();
           JMenuItem menuItem11 = new JMenuItem("Убрать ключевое слово",new ImageIcon(CreateNewTest.class.getResource("img/l_rename.gif")));
           pop2.add(menuItem11).addActionListener(new ActionListener(){
                 public void actionPerformed(ActionEvent s){
                        removeButton(button);
     }
                      });
                  Point location = button.getLocation();
                  pop2.show(button, location.x, location.y);
              }

                  }
                });


    где-то там метод для удаления
  public void  removeButton(JButton b){
        jTextPane2.remove(b);
        jTextPane2.updateUI();
    }

ничего не удаляет,менюшка вылазит не понятно где smile 
                             
PM MAIL   Вверх
LSD
Дата 28.9.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Меню отображается не там где надо потому что когда ты пишешь pop2.show(button, location.x, location.y) - то x, y должны быть смещением относительно button, т.е. что-то типа такого:
Код
popupMenu.show(button, button.getWidth() / 2, button.getHeight() / 2);


А насчет того почему кнопка не удаляется сложно сказать, по идее должна, попробуй модифицировать код так:
Код
public void actionPerformed(ActionEvent s)
{
  System.out.println("Call remove button: " + button.getText());
  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
Дата 28.9.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ничего не помагает,есть 2 кнопки,одна называется Кнопка1 ее я создала первой, вторая наз Кнопка2, 
в результате менюшка вылазит только на Кнопке2 и соответственно вывод в консоль постоянно такой:  Call remove button: Кнопка2 smile  smile 

PM MAIL   Вверх
LSD
Дата 28.9.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Вот и источник проблемы: ты неправильно определяешь с какой кнопкой работать. Попробуй получать нужную кнопку так:
Код
button.addMouseListener(new MouseAdapter()
{
  public void mouseClicked(MouseEvent q)
  {
    final JButton currentButton = (JButton) q.getSource();
    pop2 = new JPopupMenu();
    if(q.getButton() == MouseEvent.BUTTON3)
    {
      p3 = q.getPoint();
      JMenuItem menuItem11 = new JMenuItem("Убрать ключевое слово", new ImageIcon(CreateNewTest.class.getResource("img/l_rename.gif")));
      pop2.add(menuItem11).addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent s)
        {
          removeButton(currentButton);
        }
      });
      pop2.show(currentButton, 1, 1);
    }
  }
}



--------------------
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
Дата 28.9.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не удаляется,но в консоли пишет уже разные названия кнопок
PM MAIL   Вверх
LSD
Дата 28.9.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Теперь модифицируй метод removeButton():
Код
public void removeButton(JButton b)
{
  Component[] components = jTextPane2.getComponents();
  for(Component component : components)
  {
    if(component == b)
    {
      System.out.println("jTextPane2 contains button " + b.getText());
      break;
    }
  }
  jTextPane2.remove(b);
}



--------------------
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, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А он мне подчеркивает 
Код

Component component : components 
и говорит что ошибка:
Код

"CreateNewTest.java": Error #: 206 : malformed expression at line 515, column 17

первый раз такую запись for вижу
PM MAIL   Вверх
powerOn
Дата 29.9.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 31
Всего: 159



Цитата(JulT @  29.9.2006,  12:08 Найти цитируемый пост)
А он мне подчеркивает код :Component component : components .... и говорит что ошибка:


А какая у вас версия Java? Данный код будет работать в Java версии не ниже 1.5...


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Leprechaun Software Developer
****


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

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



Замени:
Код
for(Component component : components)

на
Код
for(int i = 0; i < components.length; i++)


Ты используешь не JDK 1.5?


--------------------
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, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я использую JDK 1.4
Написала так как вы сказали :
Код

  public void removeButton(JButton b){
  Component[] components = jTextPane2.getComponents();
 for(int i = 0; i < components.length; i++){
   Component component= components[i];
    if(component == b){
      System.out.println("jTextPane2 contains button " + b.getText());
      break;
    }
  }
  jTextPane2.remove(b);
}

но все равно не удаляет smile

Добавлено @ 11:27 
чуть не забыла,в консоли ничего не отрабатвается  
Код

System.out.println("jTextPane2 contains button " + b.getText());

PM MAIL   Вверх
LSD
Дата 29.9.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Значит кнопка не добавлена в jTextPane2. Тут уже надо анализировать весь код, особенно тот место где ты добавляешь кнопку в jTextPane2.


--------------------
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, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



добавляю сто процентов,ведь я ее вижу своими глазами, при нажатии на нее у меня другое окошко вылазит,Боже мой что же делать.Вставляю я вот так вот: 
Код

button=new JButton(jTextPane2.getSelectedText().trim());
                button.setIcon(new ImageIcon(CreateNewTest.class.getResource("img/l_rename.gif")));
                button.setSize(jTextPane2.getSelectedText().trim().length(),8);
                jTextPane2.insertComponent(button);

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


Leprechaun Software Developer
****


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

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



Попробуй сделать так:
Код
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(5);
  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(4);
  textPane.setSelectionEnd(7);
  textPane.replaceSelection(" ");
}



--------------------
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: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   Вверх
LSD
Дата 2.10.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Для начала попробуй его просто сериализовывать (но есть у меня сильное подозрение, что так работать не будет).

Добавлено @ 14:12 
Да, и не забудь все свои листенеры сделать сериализуемыми.


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


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

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