Расширяемая JTextArea - PullRequest
       27

Расширяемая JTextArea

0 голосов
/ 23 марта 2012

Часть приложения, которое я создаю, требует, чтобы я отображал переменную количество текста в нередактируемом компоненте некоторого вида. В настоящее время это реализовано в JTextArea, но JTextArea имеет только setRows () для установки вертикального размера компонента.

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

Какой компонент Swing лучше всего подходит для этих требований?

(Примечание: я спрашиваю здесь об этом только потому, что весь сайт документации по Oracle Java # $% ^ & *, включая все демонстрационные материалы и учебные пособия по Swing, сейчас недоступен).

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Мне удалось создать рабочий прототип для решения проблем динамического изменения размера в исходной проблеме. По мере добавления текста размер текстовой области изменяется так, чтобы он был достаточно большим для размещения текста. Очевидно, используйте setEditable (false), чтобы остановить редактирование текста. Надеюсь, это даст вам некоторые идеи.

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

Код

JFrame frame = new JFrame();
GroupLayout gLayout = new GroupLayout(frame.getContentPane());
frame.getContentPane().setLayout(gLayout);

final JTextArea area = new JTextArea();
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);

JButton button = new JButton("Add more");
button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        area.setText(area.getText()
                + "apple banana carrot dingo eagle fox gibbon ");

        // set approx number of cols
        int chars = area.getText().length();
        int cols = (int) Math.round(Math.sqrt(chars) * 1.3);
        area.setColumns(cols);

        // force recalculation
        area.setPreferredSize(new Dimension(25, 25));

        // downsize
        area.setPreferredSize(new Dimension(
                area.getPreferredSize().width,
                area.getMinimumSize().height));

    }
});

ParallelGroup hGroup = gLayout
        .createParallelGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setHorizontalGroup(hGroup);

SequentialGroup vGroup = gLayout
        .createSequentialGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setVerticalGroup(vGroup);

frame.setSize(600, 500);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

frame.invalidate();
frame.validate();
frame.setVisible(true);
0 голосов
/ 24 марта 2012

Эмм ... Если вы не хотите ввести текст, который вам не нужен JTextArea ... Просто для отображения текста вы можете просто использовать JLabel; JLabel поддерживает текстовый формат html, так что вы можете легко использовать его как-то так:

...

JPanel aPanel=new JLanel(new FlowLayout());
JLabel aLabel=new JLabel();
aPanel.add(aLabel);


void showFormattedText(String html)
{
 aLabel.setText(html);
}

...

Как вы уже догадались, форматированный текст может быть чем-то вроде этого

<html>
Put some text<br>
...<br>

</html>

Надеюсь, у вас есть концепция

...

мини-парсер - не тестировался

  String getFormattedText(String text)
{
  char commonBR='\n';
  String htmlBR="<br>";
  char check;
  String result="";

  for(int i=0; i<text.length(); i++)
  {
      check=text.charAt(i);
      if(check==commonBR)

    {

    result+=htmlBR;
    continue;
    }

    result+=check;

     }

     return result;

    }

...

void test
{
       String text="Hello world \n Hello World once again \n ...and again ";

       System.out.println(this.getFormattedText(text));
}

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

Удачи

...