Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JTextPane компоненты


Автор: hail 8.4.2007, 13:26
я уже создавал подобную тему, но там меня больше интересовала позиция компонента, и вот добрался до самих компонентов и был очень удивлен. Вот код:
Код

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class textComp{
    public static void main(String[] arg){
        new TextPane();
    }
}
class TextPane{
    JTextPane textPane = new JTextPane();
    JScrollPane scrollPane = new JScrollPane(textPane);
    JFrame form = new JFrame();
    TextPane(){
        form.add(scrollPane);
        JButton btn = new JButton("btn1");
        JLabel lbl = new JLabel("lbl");
        textPane.insertComponent(btn);
        textPane.insertComponent(lbl);
        textPane.insertComponent(new JButton("button"));
        textPane.insertComponent(new JLabel("label"));
        Component[] cmp = textPane.getComponents();
        for (int i=0; i<textPane.getComponentCount(); i++){
            if(cmp[i] instanceof JButton) System.out.println("Button: "+cmp[i]);
            else    if(cmp[i] instanceof JLabel) System.out.println("Label: "+cmp[i]);
            else System.out.println("Component: "+cmp[i]);

        }
        form.setSize(800,600);
        form.setVisible(true);
        form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

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

Component: javax.swing.text.ComponentView$Invalidator[,0,0,0x0,invalid]
Component: javax.swing.text.ComponentView$Invalidator[,0,0,0x0,invalid]
Component: javax.swing.text.ComponentView$Invalidator[,0,0,0x0,invalid]
Component: javax.swing.text.ComponentView$Invalidator[,0,0,0x0,invalid]

Ну и с такими компонентами дальше работать не получается.
Заранее благодарен за помощь.

Автор: RebornCrusader 9.4.2007, 04:56
Вчерась перед сном листал Портянкина "Swing - Эффектные пользовательские интерфейсы", там на эту тему было что-то интересное. Вечером дома гляну, если не забуду. А вообще лучше сам купи купи такую ;)

Автор: hail 9.4.2007, 12:22
Ну буду ждать, а то похоже больше ни где этого нет и ни кто этого не видел, где я уже только не искал

Автор: AntonSaburov 9.4.2007, 12:40
Так надо не в форму вставлять а в ее контекстную панель.

form.getContextPane().add(....)

Автор: LSD 9.4.2007, 14:02
Посмотри эту http://forum.vingrad.ru/topic-113978.html.

Автор: hail 9.4.2007, 15:49
Цитата(AntonSaburov @ 9.4.2007,  12:40)
Так надо не в форму вставлять а в ее контекстную панель.
form.getContextPane().add(....)

Да, я сделал, но проблему это не решило
Цитата(LSD @ 9.4.2007,  14:02)
Посмотри эту тему.

Я смотрел ее раньше, но как ты там и говорил, сериализовать текстовую модель с кнопками, картинками,... не получится (у меня не получилось). Да, сериализация этой радости есть одной из причин этого вопроса. Если я щелкаю на компоненте мышкой то в слушателе e.getComponent() работает безотказно и позицию получить можно и все ок. Я видел пример "имитация щелчка мыши", даже думал перещелкать таким образом всю текстовую область чтоб собрать все компоненты, но выглядит это полным бредом.
А из моего кода видно, что с точки зрения текстовой модели вставленный в нее компонент это такая штука javax.swing.text.ComponentView$Invalidator[,0,0,0x0,invalid] которая хранит только внешний вид компонента по которому нельзя(у меня не получилось) определить что это за компонент, и то он invalid.

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

Логично создавать какие-то теги, но хочется работать в режиме "что видишь - то и получишь", а значит теги нужно заменять компонентом, а при сохранении наоборот, а значит нужно получить компоненты из текстовой области smile 

В какую сторону двигаться и как???

Как можно организовать работу с тегами, или что-то подобное?

Автор: AntonSaburov 9.4.2007, 17:16
Может тогда лэйаут совсем убрать ?
setLayout(null) - и тогда все координаты абсолютные и "надержные"

Автор: hail 9.4.2007, 17:32
попробовал, не помогло. Результат тот же,  но в любом случае возвращает только вид компонента, буду терить StyleDocument...

Автор: Stjopka 10.4.2007, 11:11
По-моему тут действительно надо использовать не getComponent, а что-нибудь из StyledDocument. Может быть getCharacterElement(num).

Автор: LSD 11.4.2007, 14:28
Код
  public static void main(String[] args)
  {
    JTextPane textPane = new JTextPane();
    textPane.setText("ABC DEF GHI");
    textPane.setSelectionStart(3);
    textPane.setSelectionEnd(4);
    textPane.insertComponent(new JButton("<<>>"));
    textPane.setSelectionStart(7);
    textPane.setSelectionEnd(8);
    textPane.insertComponent(new JButton("<<>>"));

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

    for(Component component : textPane.getComponents())
    {
      Container container = (Container) component;
      int location = textPane.viewToModel(component.getLocation());
      System.out.println("button = " + container.getComponent(0));
      System.out.println("location = " + location);
    }
  }

Автор: hail 12.4.2007, 18:29
100% работает супер, все как надо......... спасибо. smile  smile 

Автор: LSD 13.4.2007, 09:19
Не забывай помечать вопрос как решенный.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)