2013-02-16 5 views
0

Я пытаюсь поместить текстовую область в диалоговое окно с использованием Java Swing. У меня проблема с настройкой размера этого JTextArea. Ширина текстовой области всегда равна ширине окна и растягивается с окном, если я изменяю его размер.Как я могу определить Java Swing JTextArea

private void arrangeComponents() { 
    JTextArea textArea = new JTextArea(); 
    JPanel outerPanel = new JPanel(); 
    outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.PAGE_AXIS)); 

    JScrollPane scrollPane = new JScrollPane(textArea); 
    outerPanel.add(scrollPane, BorderLayout.CENTER); 

    Container contentPane = getContentPane(); 
    contentPane.add(outerPanel, BorderLayout.CENTER); 
} 

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

Что я сделал не так?

ответ

7

Используйте JTextArea(int rows, int columns) конструктор, который определяет строки и столбцы, как показано here, и не пренебрегать pack() вмещающих Window.

+1

+1 для напоминания 'pack()! –

1

Я нашел это на простом сайте кодирования. Этот образец кода может быть вам полезен.

import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class JTextAreaTest { 
    public static void main(String[] args) { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     JFrame frame = new JFrame("JTextArea Test"); 
     frame.setLayout(new FlowLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     String text = "A JTextArea object represents a multiline area for displaying text. " 
       + "You can change the number of lines that can be displayed at a time, " 
       + "as well as the number of columns. You can wrap lines and words too. " 
       + "You can also put your JTextArea in a JScrollPane to make it scrollable."; 
     JTextArea textAreal = new JTextArea(text, 5, 10); 
     textAreal.setPreferredSize(new Dimension(100, 100)); 
     JTextArea textArea2 = new JTextArea(text, 5, 10); 
     textArea2.setPreferredSize(new Dimension(100, 100)); 
     JScrollPane scrollPane = new JScrollPane(textArea2, 
       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
       JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     textAreal.setLineWrap(true); 
     textArea2.setLineWrap(true); 
     frame.add(textAreal); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

+1 для сравнения по бокам [sscce] (http://sscce.org/). В моем примере требуется панель прокрутки, и ваш может использовать немного 'invokeLater()'. :-) – trashgod

+2

-1 для использования setPreferredSize(), которые являются просто связкой на случайных числах, которые не учитывают шрифт, который используется для определения высоты строки каждой строки. Метод setPreferredSize() просто переопределяет значения строк, столбцов, которые вы пытались указать при создании текстовой области. – camickr

+0

@camickr поднимает важный момент, который я забыл; подробнее [здесь] (http://stackoverflow.com/q/7229226/230513). Кроме того, остерегайтесь [* контейнеров без изменения размеров *) (http://stackoverflow.com/a/12532237/230513) и смотрите также [* Начальные потоки *] (http://docs.oracle.ком/JavaSE/учебник/uiswing/параллелизм/initial.html). – trashgod

2
outerPanel.add(scrollPane, BorderLayout.CENTER); 

BoxLayout не принимает ограничений, поэтому BorderLayout.CENTER ненужно.

Проблема заключается в том, что BoxLayout учитывает максимальный размер компонента, который для scrollpane устанавливается очень большим.

Вместо использования BoxLayout просто используйте панель с FlowLayout.

Запустите пример ниже, чтобы узнать, что вы сейчас делаете. Затем закомментируйте инструкцию setLayout (...) и запустите снова. По умолчанию панель использует FlowLayout, поэтому вы получите то, что хотите.

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 

      JTextArea textArea = new JTextArea(5, 30); 
      JScrollPane scrollPane = new JScrollPane(textArea); 
      //scrollPane.setMaximumSize(scrollPane.getPreferredSize()); 

      add(scrollPane); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

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

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

1

Просто вызвать этот метод для ур области текста: setLineWrap(true);

0

Если JTextArea является initializated JTextArea text = new JTextArea(int rows, int columns)

вы просто вызвать метод text.setLineWrap(true)

затем text'size фиксирована.

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