2014-02-05 1 views
1

У меня есть сценарий, например, когда пользователь нажимает кнопку, откроется всплывающее окно с текстовой областью. При необходимости текстовая область будет иметь некоторое содержимое со строкой прокрутки. Для этого я использовал JDialog и добавил текстовую область в JDialog. В моем случае я могу показать диалог при нажатии кнопки и текстовую область в диалоговом окне с содержимым. Но я не мог получить полосу прокрутки для текстовой области. Я также использовал JScrollPane для текстовой области.Swing TextArea с панелью прокрутки на JDialog

public class DialogPanel { 

    public void createDialog() { 
     final JFrame mainFrame = new JFrame(); 
     mainFrame.setVisible(true); 
     mainFrame.setSize(500, 600); 
     mainFrame.setLayout(new BorderLayout()); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton btn = new JButton("Open Dialog"); 
     mainFrame.add(btn, BorderLayout.SOUTH); 
     JTextField txtField = new JTextField(); 
     mainFrame.add(txtField, BorderLayout.NORTH); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       JDialog dialog = new JDialog(mainFrame); 
       dialog.setLocationByPlatform(true); 
       JTextArea txtArea = new JTextArea(); 
       txtArea.setAutoscrolls(true); 
       txtArea.setPreferredSize(new Dimension(900, 500)); 
       txtArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
       txtArea.setFont(new Font("courier new", Font.PLAIN, 12)); 
       txtArea.setLineWrap(true); 
       JScrollPane txtAreaScroll = new JScrollPane(); 
       txtAreaScroll.setViewportView(txtArea); 
       txtAreaScroll.setAutoscrolls(true); 

       File file; 
       String line = null; 
       StringBuilder fileContents = new StringBuilder(); 
       try { 
        file = new File(
          "D:\\Softwares\\Apache\\apache-tomcat-7.0.47\\RUNNING.txt"); 
        BufferedReader reader = new BufferedReader(new FileReader(
          file)); 
        while ((line = reader.readLine()) != null) { 
         fileContents.append(line + "\n"); 
        } 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

       txtArea.setText(fileContents.toString()); 

       dialog.add(txtAreaScroll); 
       dialog.pack(); 
       dialog.setVisible(true); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     DialogPanel dialogPanel = new DialogPanel(); 
     dialogPanel.createDialog(); 
    } 
} 

enter image description here

ответ

4

По существу, txtArea.setPreferredSize(new Dimension(900, 500)); удаляет автоматические расчеты, используемых при JTextArea, что он использует, чтобы определить объем пространства, необходимый для отображения всего текста. Вы эффектно говорите, что высота 500 пикселей высотой никогда не понадобится.

Вы «можете» установить предпочтительный размер области прокрутки, но это не рекомендуется. Вместо этого, вы хотите изменить значение, возвращаемое getPreferredScrollableViewportSize в JTextArea

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

JTextArea txtArea = new JTextArea() { 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     return new Dimension(900, 500); 
    } 

}; 

Взгляни Scrollable для более подробной информации

Обновленные

Как AndrewThompson указал, лучше (и предпочтительный способ) был бы просто указать строки и столбцы для JTextArea и пусть это выяснить, что это означает, что на основе платформы рендеринга возможностей ...

JTextArea txtArea = new JTextArea(40, 100); 

Yea для простоты ...

+0

Это работает. Спасибо за решение и объяснение. :) – AJJ

+1

Помните, Swing - это весело;) – MadProgrammer

+1

Есть ли какой-либо случай для этого подхода при установке количества столбцов и строк текстовой области? –

0

Вы используете dialog.pack() см here и определить собственный размер для диалог

+0

, который OP использует после 'dialog.add (txtAreaScroll);' и до 'dialog.setVisible (true);' – MadProgrammer

0

Таким образом youu можно использовать текстовую область с пролистайте:

   JTextArea txtArea = new JTextArea(40,100); 
       txtArea.setAutoscrolls(true); 
       txtArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
       txtArea.setFont(new Font("courier new", Font.PLAIN, 12)); 
       txtArea.setLineWrap(true); 
       txtArea.setText(j); 
       JScrollPane txtAreaScroll = new JScrollPane (txtArea, 
       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
       txtAreaScroll.setViewportView(txtArea); 
       txtAreaScroll.setAutoscrolls(true); 
       // now add scroll pane in frame