2017-08-08 62 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