2012-06-24 2 views
3

JTextArea에 많은 데이터 (멤버십 레코드)를 출력하고 나서 scrollPane에 출력하려고합니다. 여기에 코드가 있습니다. scrollpane이 작동하지 않습니다.

package Ginfo; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.io.*; 


public class ReviewAll extends JFrame implements ActionListener { 
    Container RA; 
    JPanel ReviewAll; 
    JTextArea output; 
    JButton back, quit; 

    Message m; 
    ConnectInfo c; 
    ObjectOutputStream oout; 
    ObjectInputStream oin; 

    public ReviewAll(ObjectOutputStream oout2, ObjectInputStream oin2, 
      Message m2, ConnectInfo a) { 
     super("Full results"); 
     m = m2; 
     c = a; 
     oout = oout2; 
     oin = oin2; 
     try { 
      oout.reset(); 
     } catch (IOException e) { 

     } 
     RA = getContentPane(); 
     BuildGUI(); 
     RA.add(ReviewAll); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 

     try { 
      m.type = Message.REVIEWALL; 
      oout.writeObject(m); 
      while (!m.response.equals("End of list")) { 
       m = (Message) oin.readObject(); 
       output.append("Member: " + m.main + "\n"); 
       output.append("Invited by: " + m.invitedBy + " on " + m.when 
         + "\n"); 
       output.append("Recommended by: " + m.HDTH + "\n\n"); 
      } 
      m.response = ""; 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    private void BuildGUI() { 
     ReviewAll = new JPanel(); 
     output = new JTextArea(); 
     output.setPreferredSize(new Dimension(400, 400)); 
     output.setEditable(false); 
     JScrollPane scrollPane = new JScrollPane(output); 
     scrollPane 
       .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     back = new JButton("Close window"); 
     quit = new JButton("Exit Program"); 

     ReviewAll.add(scrollPane, BorderLayout.NORTH); 
     ReviewAll.add(back, BorderLayout.SOUTH); 
     ReviewAll.add(quit, BorderLayout.SOUTH); 

     back.addActionListener(this); 
     quit.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent re) { 
     if (re.getSource() == back) { 
      new WhatToDo(oout, oin, m, c); 
      dispose(); 
     } else if (re.getSource() == quit) { 
      if (oout != null) { 
       try { 
        oout.flush(); 
        oout.close(); 
        oin.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
      System.exit(0); 
     } 
    } 
} 

그래도 난이 작업을 수행 할 때, 난 단지 (내 JTextArea에 충분한 서비스) 처음 5 기록을보고 나머지를 보려면 아래로 스크롤 할 수 없습니다. 레코드에 대해 보낸 메시지가 list.size()에 저장 될 때 m.response = "End of List"가 클라이언트 코드 (아래에 나열 됨)에 전송되기 전에 서버 코드에서 올바르게 작동한다는 것을 알았습니다. 나는 이것이 스크롤러에 관한 문제라는 것을 알고있다. 도와 주셔서 진심으로 감사드립니다.

답변

5

나는 이것이 스크롤러에 관한 문제임을 알고있다.

문제는 스크롤러가 아니라 문제를 올바르게 확장하지 못하게하는 JTextArea의 크기 또는 preferredSize를 설정하는 방법입니다. 대신 JScrollPane에 뷰포트에서 볼 수있는 행과 열의 수를 알려주기 때문에 열과 행을 설정하십시오.

즉,이 변경이에

ReviewAll = new JPanel(); 
output = new JTextArea(); 
output.setPreferredSize(new Dimension (400,400)); 

을 : 물론

ReviewAll = new JPanel(); 

// ROW_COUNT & COL_COUNT are int constants defined elsewhere 
output = new JTextArea(ROW_COUNT, COL_COUNT); // using whatever numbers work best. 

// don't set the text area's preferredSize: 
// output.setPreferredSize(new Dimension (400,400)); 

는 매직 넘버를 방지하고 대신 행 안부 카운트에 대한 상수를 사용하는 것이 가장 좋은 것입니다.

+0

매력처럼 일했습니다! 고맙습니다! –

+0

@MattWestlake : 대단히 환영합니다! –