2013-07-06 43 views
0

這裏是我的代碼:無法使JTextArea可滾動..!

final JTextArea textArea = new JTextArea(); 
textArea.setFont(new Font("MS UI Gothic", Font.PLAIN, 13)); 
textArea.setLineWrap(true); 
textArea.setBounds(77, 310, 474, 136); 
//contentPane.add(textArea); (edited...still the same problem persists..) 


JScrollPane sbrText = new JScrollPane(textArea); 
sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
contentPane.add(sbrText); 

當過我嘗試這一點,文本區域是不可見的。(我使用Eclipse的窗口Builder插件和佈局爲「絕對佈局」)..

+2

您不需要將'textArea'添加到'contentPane'中,因爲它已經包含在'sbrText'中。有關更多信息,請參閱[本教程](http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html)。 –

+0

@MichaelLang:是的......試過這個太友...沒有運氣.. !! –

+0

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

2

在這裏,我都做了,同樣的啄使用Nested Layout,看看代碼示例:

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

public class WelcomeExample 
{ 
    private JPanel headerPanel; 
    private JButton logoutButton; 

    private JPanel leavePanel; 
    private JRadioButton casualRButton; 
    private JRadioButton specialRButton; 
    private JRadioButton sickRButton; 
    private JRadioButton privilegeRButton; 
    private ButtonGroup radioButtonGroup; 

    private JTextField leaveDaysField; 
    private JButton checkLeaveButton; 

    private JTextArea notesArea; 
    private JScrollPane notesScroller; 

    private JButton applyLeaveButton; 

    private String headerText = "<html><body><h1><font " + 
      "color=\"red\">Welcome : </font><font color" + 
      "=\"blue\">Code Zero</font></h1></body></html>"; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Welcome"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout(5, 5)); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

     headerPanel = getHeaderPanel(); 
     leavePanel = getLeavePanel(); 

     contentPane.add(headerPanel, BorderLayout.PAGE_START); 
     contentPane.add(leavePanel, BorderLayout.CENTER); 
     contentPane.add(getApplyPanel(), BorderLayout.PAGE_END); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private JPanel getHeaderPanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout(5, 5)); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     JLabel headerLabel = new JLabel(headerText, JLabel.CENTER); 
     JPanel buttonPanel = new JPanel(); 
     logoutButton = new JButton("Logout"); 
     buttonPanel.add(logoutButton); 
     panel.add(headerLabel, BorderLayout.CENTER); 
     panel.add(buttonPanel, BorderLayout.LINE_END); 
     panel.add(new JSeparator(
      SwingConstants.HORIZONTAL), BorderLayout.PAGE_END); 

     return panel; 
    } 

    private JPanel getLeavePanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout(5, 5)); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

     JPanel leaveHeaderPanel = new JPanel(); 
     leaveHeaderPanel.setLayout(new GridLayout(0, 1, 5, 5)); 
     leaveHeaderPanel.setBorder(
      BorderFactory.createTitledBorder("Choose a leave type : ")); 
     JPanel leaveTypePanel = new JPanel(); 
     leaveTypePanel.setLayout(new FlowLayout(
           FlowLayout.LEFT, 5, 5)); 
     casualRButton = new JRadioButton("Casual Leave"); 
     specialRButton = new JRadioButton("Special Leave"); 
     sickRButton = new JRadioButton("Sick Leave"); 
     privilegeRButton = new JRadioButton("Privilege Leave"); 

     radioButtonGroup = new ButtonGroup(); 
     radioButtonGroup.add(casualRButton); 
     radioButtonGroup.add(specialRButton); 
     radioButtonGroup.add(sickRButton); 
     radioButtonGroup.add(privilegeRButton); 

     leaveTypePanel.add(casualRButton); 
     leaveTypePanel.add(specialRButton); 
     leaveTypePanel.add(sickRButton); 
     leaveTypePanel.add(privilegeRButton); 

     JPanel applyLeavePanel = new JPanel(); 
     applyLeavePanel.setLayout(new FlowLayout(
           FlowLayout.LEFT, 5, 5)); 
     JLabel applyLeaveLabel = new JLabel(
       "Apply for (No. of days) : ", JLabel.CENTER); 
     leaveDaysField = new JTextField(5); 
     checkLeaveButton = new JButton("Check Leave Availability"); 

     applyLeavePanel.add(applyLeaveLabel); 
     applyLeavePanel.add(leaveDaysField); 
     applyLeavePanel.add(checkLeaveButton); 

     leaveHeaderPanel.add(leaveTypePanel); 
     leaveHeaderPanel.add(applyLeavePanel); 

     notesArea = new JTextArea(10, 10); 
     notesScroller = new JScrollPane(); 
     notesScroller.setBorder(
      BorderFactory.createTitledBorder(
       "Leave Note (Max. 200 Characters) : ")); 
     notesScroller.setViewportView(notesArea); 

     panel.add(leaveHeaderPanel, BorderLayout.PAGE_START); 
     panel.add(notesScroller, BorderLayout.CENTER); 

     return panel; 
    } 

    private JPanel getApplyPanel() 
    { 
     JPanel panel = new JPanel(); 
     applyLeaveButton = new JButton("Apply"); 
     panel.add(applyLeaveButton); 

     return panel; 
    } 

    public static void main(String[] args) 
    { 
     Runnable runnable = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new WelcomeExample().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 

輸出:

WELCOME EXAMPLE

+0

啊......只是我在找.. ..! 謝謝maitey .. !! :D(Y) –

+0

與您的代碼進行比較,我非常確定,它不包含大驚小怪,我們正在討論與使用佈局管理器相關的問題:-),其餘的部分您最喜歡並保持微笑: - ) –

+0

肯定的事情..! :) –

1

我認爲你不需要做contentPane.add(textArea);。正是這條線導致了這個問題。註釋掉這個,你的代碼應該可以正常工作。

請參閱this答案,它可能會幫助你。

下面的代碼運行在我的地方罰款:

final JTextArea textArea = new JTextArea(); 
     textArea.setFont(new Font("MS UI Gothic", Font.PLAIN, 13)); 
     textArea.setLineWrap(true); 
     textArea.setBounds(77, 310, 474, 136); 

     JScrollPane sbrText = new JScrollPane(textArea); 
     sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     frame.getContentPane().add(sbrText);//contentPane.add(sbrText); 
     frame.setVisible(true); 

如果你的代碼不罰款運行,那麼你必須有可能與您的contentpane.

+0

根據之前的評論/建議,我也嘗試過......但是問題依然如此。 :( - –

+0

此外,我也嘗試在此代碼片段:http://stackoverflow.com/questions/8849063/adding-a-scrollable-jtextarea-java ... 仍然沒有運氣.. !! :-( –

+0

@CodeZero:你有沒有嘗試像這樣'JTextArea tArea = new JTextArea(20,20);'提供'rows/columns'(不使用無參數的構造函數)來初始化'JTextArea'。給一些大小(不要使用setXxX()方法,只是這個東西)以這種方式到'JTextArea',以便'JScrollPane'可以依靠它。答案是好的,毫無疑問,在這:-),已經upvoted這一個 –

1

好了一些其他錯誤...我終於得到了它的工作......我在滾動窗格而不是文本區域中指定了相同的集合邊界。這裏是代碼。^_^

 final JTextArea textArea = new JTextArea(); 
     textArea.setFont(new Font("MS UI Gothic", Font.PLAIN, 13)); 
     textArea.setLineWrap(true); 
     //textArea.setBounds(77, 310, 474, 136); 

     JScrollPane scroll = new JScrollPane (textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);   
     scroll.setBounds(77, 310, 474, 136); 
     contentPane.add(scroll); 

以下是截圖:

上一頁:http://oi40.tinypic.com/11jyum0.jpg
現在:http://oi44.tinypic.com/2s9vdvt.jpg

+1

這就是你做錯了什麼,使用'絕對定位'__(所有問題的禍害)__。相反,你應該使用嵌套佈局來實現這個'View' :-) –

+0

哈哈..好吧..但由於我是JAVA編程的新手,絕對定位我似乎得到了我所需要的,沒有太多大驚小怪。 :P 感謝您的所有提示,但.. ..! :) –

+0

當我剛剛接觸Java Swing時,我現在用同樣的錯誤做,但後來我意識到Layouts是Swing的一部分是多麼重要:-) –