2011-08-22 2 views
4

Для того, чтобы иметь возможность отображать предложение по a, скажем, JPanel с GridLayout(1,0) [то есть только одну строку/строку], а затем иметь возможность рисовать синтаксическое дерево (или подобное) над ним, я хочу отобразить предложение в виде строки String s, каждая из которых содержит одно слово.Отобразить строку строк на JComponent, чтобы можно было выбрать одиночные строки/их местоположение getLocation() - возможно?

Одиночные String s должен затем быть либо по выбору (как в JList), или я должен по крайней мере быть в состоянии получить их расположение на JPanel через getLocation().

До этого момента я попробовал следующие варианты, и имели следующие вопросы: - Свободна String сек как JLabel S: JLabel s растянуты, чтобы заполнить JPanel ширину, изменение размера их, чтобы соответствовать единственной String они выглядят сложными. Тем не менее, я хотел бы сделать это, чтобы сделать предложение посмотреть как предложение, а не как плохо выложенный стол. - JList: Все функциональные возможности, которые я хочу, но я не знаю о возможности изменить размер «ячеек» одного String (см. JLabel выше). Кроме того, у меня возникают трудности с ограничением отображения JList на одну строку/строку (см. another of my questions). - JTextArea: Я не мог разглядеть, как получить местоположение единственного String s, которое я добавил к JTextArea.

Я знаю, что drawString()может быть быть вариантом, но я боюсь использовать его, так как я не хочу смешивать AWT и Swing. Кроме того, мне нужно будет вычислить значения int для x и y для каждого String. И я не уверен, смогу ли я получить их местоположения вообще (хотя я мог бы, конечно, сохранить их int s на карте или векторе, так как мне все равно их вычислить).

Благодарим за любые предложения! Благодаря!

ответ

3

Я использовал бы JTextArea и метод modelToView()/viewToModel(), чтобы получить x, y для позиции в строке и позиции в строке для координат x и y.

Также используется Utilities класс getWordStart() getWordEnd() getRowStart() getRowEnd() методов.

+0

+1 Если я не ошибаюсь, это будет лучше масштабироваться по мере роста числа линий. – trashgod

1

EDIT: Как было отмечено camickr в комментариях, setSize() не является подходящим способом выложить компоненты (как это делается автоматически с помощью соответствующего LayoutManager, я удалил соответствующий код из моего ответа

срабатывала. по StanislavL's answer, я нашел решение, чтобы сделать это с помощью JTextField, хотя и с помощью одного для каждого String, а не только один (как это было предложено StanislavL).

Теперь я могу легко getLocation() для каждого JTextField. просто, на самом деле!

Я хотел бы поблагодарить StanislavL за его ответ, без которого я бы никогда не подумал об этом, и камикр за его комментарий.

+0

-1, Почему вы не используете диспетчер компоновки?Просто используйте FlowLayout по умолчанию, и компоненты будут правильно выравниваться в строке. – camickr

+0

Извините, но думаю -1 не подходит. Обычно, когда вы используете JPanel, вы используете LayoutManager (см. Мое редактирование). И, конечно, компоненты будут выравниваться подряд, это было не то, что мне нужно. Фактически, я * am * использую FlowLayout. Я хотел бы получить местоположение (через 'getLocation()' для каждой «String» («компонентный» как в StanislavL, так и в моем примере как JTextFields)), или сделать возможным выбор одного * слова *. И для этого мое решение было более работоспособным для * me *, хотя StanislavL, очевидно, так же хорош, и только вызвал мой. Поэтому я думаю, что это не -1. –

+0

Извините, я проголосовал за публикацию, потому что ваш код использует setSize(), и вы сказали, что не указали менеджер макета, который я интерпретировал как означающий, что вы используете нулевой макет. Однако, если вы просто используете менеджер компоновки по умолчанию, который является FlowLayout, тогда setSize() не требуется, поскольку FlowLayout будет уважать предпочтительный размер текстового поля. Задачей ЛЮБОГО менеджера макетов задавать размер компонента. Вы никогда не должны ссылаться на метод setSize(). При удалении кода setSize() из примера я удалю проголосовавший голос. – camickr