2015-07-15 4 views
0

Мой вопрос, вероятно, имеет элементарный ответ. Я прочитал несколько руководств, но не смог найти конкретного ответа, и я только начинаю изучать концепции ООП.Как получить уникальную строку из компонентов Swing?

Ожидаемый результат: добавьте focusListener к каждому компоненту в JPanel и на этом событии с фокусировкой, получите строку, уникальную для каждого компонента (поэтому каждое текстовое поле может иметь «это поле 1», «это поле 2», и т.д.)

Проблема:

for (Component comp : bookCard.getComponents()) 
     { 
      comp.addFocusListener(new FocusAdapter() 
      { 
       @Override 
       public void focusGained(FocusEvent e) 
       { 
        super.focusGained(e); 

        //How do I implement the following line? 
        System.out.println(this.getUniqueString()); 
       } 
      }); 
     } 

Мой класс иерархии (правильный термин) выглядит следующим образом: BookCard расширяет MainCard, MainCard расширяет JPanel. Это отлично.

Какая иерархия мне понадобится для решения этой конкретной проблемы? Что-то вроде: MyTextField расширяет MyComponent, MyComponent расширяет JComponent - где MyComponent содержит метод getUniqueString()?

Edit: Чтобы быть более конкретным, я готовлю диалог похож на диалог Microsoft Word в «добавить новый источник», который хватал пример строки из компонента, чтобы помочь пользователю. Поле «Автор» может сказать «Пример: Крамер, Джеймс Д».

+0

Вы могли бы улучшить этот код, только создавая 1 фокус адаптера, и использовать его для всех компонентов суб – ControlAltDel

+0

@ ControlAltDel Спасибо, что заметили, что это имеет смысл. – TrickyTrev

+0

Обратите внимание, что 'this', вероятно, не так, как вы думаете, назовите FocusAdapter. –

ответ

2

Что касается уникального имени, вы можете использовать JComponent.set/getName, чтобы установить уникальное имя для каждого компонента.

+0

Это, безусловно, лучшее решение. Для 'FocusEvent e' do' e.getComponent(). GetName() '. Имя должно быть указано заранее по своему вкусу. –

0

Я бы использовал интерфейс, который все ваши компоненты должны реализовать, и который предоставляет геттер для уникальной строки.

В вашем коде вы должны проверить, реализует ли этот компонент этот интерфейс, и если вы его применяете и вызываете метод.

Пример:

Интерфейс:

interface UniqueComponent { 
    String getUniqueString(); 
} 

Использование:

JComponent component = ...; 
if(component instanceof UniqueComponent) { 
    String uniqueString = ((UniqueComponent)component).getUniqueString(); 
} 

Один вопрос будет оставаться хотя: как бы вы убедитесь, что строка является уникальной? Для чего тебе это?

В случае, если это просто предназначено для уникального определения экземпляра компонента, вы можете либо использовать System.identityHashCode(component), который должен возвращать другой хеш-код для каждого экземпляра. Это не то, что читаемо, но должно быть уникальным.

Другим вариантом может быть использование UUID, также не вполне читаемого, но похожего в уникальности.

Для большей удобочитаемости вы также можете комбинировать имя класса компонента с хэш-кодом объекта, который в основном является тем, что делает реализация по умолчанию toString().

+0

Я создаю диалог, похожий на диалоговое окно «Добавить новый источник» в Microsoft Word, в котором вы получите пример String из компонента, чтобы помочь пользователю. Поле «Автор» может сказать «Пример: Крамер, Джеймс Д». Извините за двусмысленность, я бы опубликовал фотографию того, чего я пытаюсь достичь, если моя репутация позволит. – TrickyTrev

0

Если вам нужен глобальный уникальный идентификатор, вы можете рассмотреть UID ...

экземпляра

UID содержит три примитивных значений:

уникальной, An INT, который однозначно идентифицирует виртуальную машину, что этот UID был создан в, по отношению к своему хозяину и в то время, представленное значение времени (пример реализации уникального значения будет идентификатором процесса) или ноль для известного UID

время, равное длительности (как возвращается System.currentTimeMillis()), в котором виртуальная машина, с которой был создан этот UID in был жив или равен нулю для известного UID

count, краткое, чтобы отличить UID, сгенерированные i n та же самая VM с одинаковым значением времени

+0

Посмотрите здесь несколько примеров http://www.javapractices.com/topic/TopicAction.do?Id=56 – Constantin

1

У меня вопрос, вероятно, имеет элементарный ответ. Я прочитал несколько уроков , но не смог найти конкретный ответ, и я всего лишь , начинающий изучать концепции ООП.

не имеет что-то с концепциями объектно-ориентированного программирования, это может быть около программирует логик, по умолчанию в progemming не требуется, чтобы получить какой-либо уникальный идентификатор во время выполнения

Так что же иерархии мне нужно для решения этой проблемы ? Что-то вроде: MyTextField расширяет MyComponent, MyComponent расширяет JComponent - где MyComponent содержит метод getUniqueString() ?

, кажется putClientProperty/getClientProperty является правильный метод для ваших требований, он может быть умножено с любыми описаниями, for example

Смежные вопросы