2017-08-08 144 views
0

有些東西我不明白。我的代碼顯然不喜歡JScrollBar。我添加它,我不能水平滾動也不能垂直滾動。JScrollPane在JTextArea中不滾動

這裏是什麼樣子:

請記住,我是新的,我仍然在做這個工作,所以我很抱歉,如果這是真的東西明顯,容易避免。

public ChangeLog() { 

    //Init. 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    JTextArea textarea = new JTextArea(); 
    JScrollPane scrollpane = new JScrollPane(textarea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

    //Text Stuff 
    textarea.setFont(textarea.getFont().deriveFont(16f)); 
    textarea.setText("Change Log: \n V1.0(A): Original encoder \n V1.0(B): Original decoder \n V1.1: Combination of both encoder and decoder \n V1.2: Added a heavier encoding & decoding system \n V1.3: Added an icon \n V1.4: Created an 'Info' page \n V1.5: Added a 'Change Log' page to the 'Info' page \n " 
      + "V1.6: Removed the 'Change Log' \n V1.7: Added a 'Change Log' but was not implemented \n V1.8: Added a the 'Change Log' button \n V1.9: Added horizontal and vertical scroll bars to the 'Change Log'"); 
    textarea.setForeground(Color.BLACK); 
    Dimension d = new Dimension(250, 275); 
    textarea.setPreferredSize(d); 

    //Other Stuff 
    scrollpane.setViewportView(textarea); 
    scrollpane.getPreferredSize(); 

    //Layout 
    panel.setLayout(null); 
    scrollpane.setBounds(new Rectangle(new Point(20, 20), scrollpane.getPreferredSize())); 
    textarea.setBounds(new Rectangle(new Point(20, 23), textarea.getPreferredSize())); 

    //Frame Stuff 
    frame.setAlwaysOnTop(true); 
    frame.setSize(300, 350); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setResizable(false); 

    //Panel Stuff 
    frame.add(panel); 
    panel.setSize(frame.getSize()); 
    panel.setBackground(Color.BLUE); 
    panel.add(textarea); 
    panel.add(scrollpane); 
} } 
+0

你不需要添加'textarea'只添加'scrollpane'看看這個[如何在文本區添加scrollPane](https://stackoverflow.com/a/8849094/5855946) –

+1

1 )Java GUI必須在不同的語言環境中使用不同的PLAF來處理不同的操作系統,屏幕大小,屏幕分辨率等。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 2)爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

+0

.. 3)請參閱[我是否應避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法?](http://stackoverflow.com/q/7229226/418556)(是)4)它如果文本區域的行代替顯示爲「JList」中的條目,則可能對用戶更好。 5)源代碼中的單個空白行是所有需要的。 '{'之後或'}'之前的空行通常也是多餘的。 6)*「請記住,我是新的」*該代碼片段有太多不好的做法,我停止計數。 ... –

回答

0

我已經創建了一個工作解決方案。也做了一些改變。

public TestClass() { 

     //Init. 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(new BorderLayout()); 
     JTextArea textarea = new JTextArea(); 
     JScrollPane scrollpane = new JScrollPane(textarea); 
     panel.add(scrollpane, BorderLayout.CENTER); 



     //Text Stuff 
     textarea.setFont(textarea.getFont().deriveFont(16f)); 
     textarea.setText("Change Log: \n V1.0(A): Original encoder \n V1.0(B): Original decoder \n V1.1: Combination of both encoder and decoder \n V1.2: Added a heavier encoding & decoding system \n V1.3: Added an icon \n V1.4: Created an 'Info' page \n V1.5: Added a 'Change Log' page to the 'Info' page \n " 
       + "V1.6: Removed the 'Change Log' \n V1.7: Added a 'Change Log' but was not implemented \n V1.8: Added a the 'Change Log' button \n V1.9: Added horizontal and vertical scroll bars to the 'Change Log'"); 
     textarea.setForeground(Color.BLACK); 
     //Dimension d = new Dimension(250, 275); 
     //textarea.setPreferredSize(d); 


     //Other Stuff 
     scrollpane.setViewportView(textarea); 
     scrollpane.getPreferredSize(); 




     //Layout 
     //scrollpane.setBounds(new Rectangle(new Point(20, 20), scrollpane.getPreferredSize())); 
     //textarea.setBounds(new Rectangle(new Point(20, 23), textarea.getPreferredSize())); 

     //Listeners 



     //Frame Stuff 
     frame.setAlwaysOnTop(true); 
     frame.setSize(300, 350); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setResizable(false); 


     //Panel Stuff 
     frame.add(panel); 
     panel.setSize(frame.getSize()); 
     panel.setBackground(Color.BLUE); 
     panel.add(scrollpane); 
    } 

此外,當擺動更好地與佈局管理器和空佈局將工作導致對不同的屏幕類型的外觀不一致。

讓我知道是否有更多需要。是的,每個人都從頭開始。我仍在學習。你也會得到很多東西。只要保持學習的飢餓感。 :-)

1
Dimension d = new Dimension(250, 275); 
textarea.setPreferredSize(d); 

不要硬編碼的尺寸爲文本區。文本區域的大小會隨着文本的添加/刪除而動態變化,滾動條會根據需要顯示/消失。

JTextArea textarea = new JTextArea(); 

不要創建沒有參數的文本區域。相反,當您創建文本區域時,請使用以下內容:

JTextArea textarea = new JTextArea(5, 20); 

建議默認大小的文本區域。然後當你有超過5行的文本滾動條會出現。

所以我一個相對較新的Java開發人員

開始通過閱讀Swing Tutorial爲Swing基礎。有一個關於How to Use Text Areas的部分讓你開始。

panel.setLayout(null); 
scrollpane.setBounds(...) 

不要空佈局。不要使用setBounds()。 Swing旨在與佈局經理一起使用。有關工作示例,請參閱上面的教程。

+0

刪除維度和「textarea.setPreferredSize(d);」刪除滾動條,添加「5,20」沒有明顯的影響,但將其更改爲「5,10」或「5,5」顯示此:https://gyazo.com/fe8c1842fe63948ecbd47bb3896122f1 – Attaxika

+0

我已經告訴過你「工作」滾動條只會在添加文本時出現。你的結構代碼很差,包含所有的null佈局和setSize(..)和setBounds(...)語句。擺脫他們。您也有問題,例如在向其添加組件之前使框架可見。我沒有時間批評每一行代碼。閱讀教程並下載工作示例並修改示例。你的代碼將會更好的結構化並且更容易學習。 – camickr