Пользовательский свинг JTextComponent [закрыт]

Я хочу создать JTextArea, который выглядит как JTextArea, действует как JTextArea, отвечает как JTextArea, говорит как JTextArea, перемещается как JTextArea и т. д., но не является JTextArea.

Короче говоря, я хотел бы создать собственный компонент свинга, основанный на 100% JTextArea. Как только я это сделаю, я смогу изменить другие жестко закодированные свойства JTextArea и создать свой собственный JTextArea. Нет предопределенных компонентов Swing, которые разработаны так, как мне нужно, но JTextArea ближе всего, поэтому я выбираю его.

Я хотел бы изменить интервал между строками JTextArea. И нет, я не хочу использовать JtextPane, я пробовал, он не работает с моей программой, он вычисляет свою позицию по-другому, выглядит по-другому, и применение границы JtextArea только еще больше портит ситуацию.

Я не пытаюсь расширить JTextArea, я пытаюсь создать пользовательскую JTextArea, как в настраиваемый компонент Swing с измененными жестко запрограммированными свойствами, которые нельзя настроить с помощью методов JTextAreas.

Однако я понятия не имею, как это сделать. Я искал его в Интернете, но там есть только обширное руководство по созданию собственного компонента из страта...

Выяснение этого займет много времени и не решит мою проблему.

Единственное, что мне нужно сделать, это создать класс (или несколько классов), который будет содержать все, что создает JTextArea. Начните с уровня JTextComponent и скопируйте все классы более низкого уровня, которые используются при создании JTextArea. Я также хотел бы отметить, что я использую внешний вид Nibus, я думаю, что могут быть некоторые классы, которые необходимо включить, чтобы пользовательский JTextArea функционировал должным образом в этом LAF.

Я просмотрел исходный код свинга, и он полон всего. Выяснение того, какие классы или их части используются при создании JTextArea, было бы трудоемким кошмаром, учитывая, что у меня нет знаний о базовой структуре и механике свинга.

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

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

Я пытаюсь срезать путь здесь. Я не хочу полностью понимать свинг, я просто хочу, чтобы эта штука работала. Расстояние по умолчанию на один пиксель меньше, и все, что я хочу сделать, это просто увеличить его на этот пиксель. Я не хочу знать, как художник рисует компонент на экране, я просто хочу знать, откуда он вызывается и как он себя называет...

Спасибо всем, кто найдет время.


person Karlovsky120    schedule 25.10.2012    source источник
comment
Вы пытались просто скопировать исходный код и переименовать его?   -  person Coupon22    schedule 26.10.2012
comment
Почему бы просто не сделать ваш класс расширением JTextArea? в этом суть ОО   -  person durron597    schedule 26.10.2012
comment
Вы не поняли, что я пытаюсь здесь сделать. Я не делаю простое расширение компонента, я пытаюсь закодировать совершенно новый компонент Swing (который на 100% основан на JTextArea, но все же). Для этого мне нужны исходные классы JTextArea, расположенные в папке src JDK... Я просто не знаю, какие именно...   -  person Karlovsky120    schedule 26.10.2012
comment
Начните с наименования вещей, которые нельзя настроить.   -  person Lukas Knuth    schedule 26.10.2012
comment
Если это на 100% основано на JTextArea, это звучит так, как будто вы не понимаете сути объектно-ориентированного программирования. В противном случае, если вы абсолютно хотите полностью написать свой собственный компонент, продолжайте, так как это будет хорошим академическим упражнением. Начните с расширения JTextComponent, что должны делать все текстовые компоненты, и углубитесь в исходный код JTextComponent, JTextArea, PlainDocument, AbstractDocument и т. д. Это потребует много работы, но вы научитесь много, я уверен.   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
О, кроме того, я не вижу, как кто-то может провести вас через это на этом сайте, так как это в основном будет включать в себя ваше изучение исходного кода, и это может занять недели, чтобы вы полностью его поняли. Голосование за закрытие этого вопроса, так как на этом сайте нет ответа.   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
Мне просто нужен список классов, которые я должен посмотреть. В папке src есть куча классов JTextComponent и JTextArea, и я хотел посмотреть, какие классы изучать дальше... Может быть, не учиться, а начать оттуда работать... Если бы вы просто закончили этот список, это помогло бы мне много, это то, что я только просил: JTextComponent, JTextArea, PlainDocument, AbstractDocument и т.д...   -  person Karlovsky120    schedule 26.10.2012
comment
re "I'm trying to take a shortcut here. I don't want to fully understand swing, I just want this thing to work." -- серьезно? В самом деле??   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
@ Karlovsky120 Честно говоря, вам следует объяснить, чего вы хотите достичь, а не говорить, что JTextArea не может этого сделать. Многие элементы можно настроить через XxxUI-свойства, но они не отображаются непосредственно в API. Поэтому, если вы объясните, чего вы пытаетесь достичь, мы можем найти стандартный способ сделать это, который будет проще.   -  person Guillaume Polet    schedule 26.10.2012
comment
Если вы серьезно относитесь к переписыванию текстового компонента с нуля и хотите, чтобы мы описали то, что вам нужно, большинству из нас потребуется 1-2 недели, чтобы самостоятельно изучить исходный код, прежде чем мы сможем придумать жизнеспособный вариант. решение. Если вам нужна помощь от кого-то, кто знает этот код вдоль и поперек, тогда вам нужна помощь от одного из авторов Swing, и вы не найдете ее здесь. Серьезно реалистичный способ сделать это - либо расширить JTextArea, либо использовать JTextArea, где вы изменяете его свойства. По моему мнению, на ваш текущий вопрос в том виде, в котором он был задан, нет ответа. И ваше желание...   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
... просто заставить его работать без полного понимания Swing несколько оскорбительно, поскольку вы потребуете от нас больших усилий, не показывая, что вы готовы приложить то же самое. Вот почему я голосую за закрытие этого вопроса.   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
Посмотрите на это таким образом. Вы хотите добавить выхлопную трубу в свой автомобиль. вам не нужно изучать, как работает вся машина, вам просто нужно посмотреть на старую, посмотреть, как она была подключена, а затем таким же образом подключить новую ... И для комментария ниже я добавил объяснение...   -  person Karlovsky120    schedule 26.10.2012
comment
Ваша метафора не сработает, поскольку здесь вы не водите машину и не чините машину,... вы создаете ее полностью, полностью из базовых библиотек компонентов, так что да, вам лучше приложить усилия, чтобы полностью понять, как работает машина сверху донизу.   -  person Hovercraft Full Of Eels    schedule 26.10.2012
comment
добавьте выхлопную трубу в свой автомобиль есть вероятность, что вы умрете от угарного газа в следующий раз, когда будете водить его ;-) Или, другими словами: нет абсолютно никакого способа создать пользовательский компонент, такой же сложный, как textComponent, не зная гораздо больше о внутренностях, как вы.. (или я знаю :-) -1 и голосую, чтобы закрыть этот вопрос   -  person kleopatra    schedule 26.10.2012


Ответы (1)


Я хотел бы изменить интервал между строками JTextArea

Моей первой мыслью было, что переопределения javax.swing.JTextArea#getRowHeight будет достаточно. В javadoc четко указано

Определяет значение высоты строки. По умолчанию это высота шрифта.

Поэтому я надеялся, что, переопределив этот метод, вы скорректируете определение и получите больше интервалов между строками. Облом, не сработало. Быстрый поиск по использованию этого метода в JDK показал то же самое. Он в основном используется для расчета некоторых размеров, но точно не используется при рисовании текста внутри компонента.

Глядя на исходный код метода javax.swing.text.PlainView#paint, я увидел, что используются FontMetrics, а те, которые вы можете легко переопределить в JTextArea. Таким образом, второй подход заключался в расширении JTextArea (бва, расширение компонентов Swing, но это для проверки концепции)

  private static class JTextAreaWithExtendedRowHeight extends JTextArea{
    private JTextAreaWithExtendedRowHeight( int rows, int columns ) {
      super( rows, columns );
    }

    @Override
    public FontMetrics getFontMetrics( Font font ) {
      FontMetrics fontMetrics = super.getFontMetrics( font );
      return new FontMetricsWrapper( font, fontMetrics );
    }
  }

Класс FontMetricsWrapper в основном делегирует все, кроме метода getHeight. В этом методе я добавил 10 к результату делегата

@Override
public int getHeight() {
  //use +10 to make the difference obvious
  return delegate.getHeight() + 10;
}

И это приводит к большему междустрочному интервалу (и к каретке, которая слишком длинная, но, вероятно, ее можно отрегулировать).

Небольшой скриншот, чтобы проиллюстрировать это (не такой красивый, как некоторые другие, но он показывает, что этот подход может работать):

Разница между обычной текстовой областью и расширенной

Небольшой отказ от ответственности: это похоже на уродливый взлом и может привести к неожиданным проблемам. Я надеюсь, что кто-то придет с лучшим решением.

person Robin    schedule 25.10.2012
comment
Дайте вам 1+ на этом! Но помните, он категорически против расширения JTextArea. Почему? Только Господь знает. - person Hovercraft Full Of Eels; 26.10.2012
comment
Вы должны опубликовать это (или ссылку на него) по другому его вопросу с вознаграждением: stackoverflow.com/questions/13001238/ - person Nick Rippe; 26.10.2012
comment
@HovercraftFullOfEels из предыдущих вопросов, я подозреваю, что он делает что-то настолько неправильно в другом месте, что хватается за соломинку ... просто говорю .. +1 за хорошее копание, не ожидал, что установка межстрочного интервала не поддерживается, даже мой дедушкина печатная машинка могла это сделать :-) - person kleopatra; 26.10.2012
comment
@kleopatra Я был больше удивлен тем, что переопределение метода getRowHeight просто регулирует некоторые размеры, но не влияет на высоту строки. Это означает, что когда вы создаете текстовую область с 30 строками (переданными в конструкторе), вы фактически получаете текстовую область, в которой предпочтительный размер позволяет гораздо больше, чем 30 строк... - person Robin; 26.10.2012
comment
хороший улов, не подумал об этом :-) - person kleopatra; 26.10.2012