2016-05-04 94 views
1

我打算做一個簡單的記事本。我用JTextArea寫了一些文字,我想scrollbarJTextArea。我寫了幾行代碼。如何在JTextArea上添加JScrollPane

package project.notepad; 

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

public class Notepad extends JFrame { 
    private JTextArea area; 
    private JMenu filemenu; 
    private JMenu editmenu; 
    private JMenu formatmenu; 
    private JMenu helpmenu; 
    private JScrollPane scroll; 

    private JMenuBar menubar; 
    private JMenuItem newmenuitem; 
    private JMenuItem openmenuitem; 
    private JMenuItem savemenuitem; 
    private JMenuItem exitmenuitem; 


    public Notepad() { 
     initComponents(); 
     setComponents(); 

     setTitle("Simple Notepad"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setResizable(true); 
     setSize(600, 600); 
     setJMenuBar(menubar); 


     menubar.add(filemenu); 
     menubar.add(editmenu); 
     menubar.add(formatmenu); 
     menubar.add(helpmenu); 
     filemenu.add(newmenuitem); 
     filemenu.add(openmenuitem); 
     filemenu.add(savemenuitem); 
     filemenu.add(exitmenuitem); 

     add(area); 
     add(scroll); 
    } 


    public final void initComponents() { 
     scroll = new JScrollPane(area, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     area = new JTextArea(); 
     menubar = new JMenuBar(); 
     filemenu = new JMenu(" File"); 
     editmenu = new JMenu(" Edit"); 
     formatmenu = new JMenu(" Format"); 
     helpmenu = new JMenu(" Help"); 
     newmenuitem = new JMenuItem(" New"); 
     openmenuitem = new JMenuItem(" Open"); 
     savemenuitem = new JMenuItem(" Save"); 
     exitmenuitem = new JMenuItem(" Exit"); 
    } 

    public final void setComponents() { 
     area.setSize(600, 600); 
     area.setBackground(Color.WHITE); 
    } 


    public static void main(String[] args) { 
     new Notepad(); 
    } 
} 

我不確定問題出在哪裏。

+1

什麼是不工作?你有錯誤嗎? – Mxsky

+0

我只是試過這段代碼,它似乎工作。問題在哪裏? – RAnders00

回答

0

有三個問題在這裏:

1)您添加areaJScrollPane,前area被初始化。

所以你最終得到一個JScrollPane包含一個null組件。

要修復此問題,請在將其添加到JScrollPane之前實例化area

2)您添加areaJFrame,然後添加含areaJScrollPane

這是錯誤的,一個Component不能被添加多次。最後一次加法將勝出,所以最後你的JFrame包含JTextAreaJScrollPane之間的混合物,現在包含null

要解決此問題,請刪除add(area);

3)你叫setVisible太早

你應該叫setVisible(true),只有當已經添加的所有組件。

下面的代碼顯示了根據修改相關的兩個方法(註釋已添加更改):

public Notepad() { 
    initComponents(); 
    setComponents(); 

    setTitle("Simple Notepad"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    setResizable(true); 
    setSize(600, 600); 
    setJMenuBar(menubar); 

    menubar.add(filemenu); 
    menubar.add(editmenu); 
    menubar.add(formatmenu); 
    menubar.add(helpmenu); 
    filemenu.add(newmenuitem); 
    filemenu.add(openmenuitem); 
    filemenu.add(savemenuitem); 
    filemenu.add(exitmenuitem); 

    //add(area); // remove this, the textarea is already added to the scrollpane 
    add(scroll); 

    // set the frame visible, only once all components have been added 
    setVisible(true); 
} 

public final void initComponents() { 

    area = new JTextArea(); // instantiate the textarea, before adding to the scrollpane 
    scroll = new JScrollPane(area, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

    menubar = new JMenuBar(); 
    filemenu = new JMenu(" File"); 
    editmenu = new JMenu(" Edit"); 
    formatmenu = new JMenu(" Format"); 
    helpmenu = new JMenu(" Help"); 
    newmenuitem = new JMenuItem(" New"); 
    openmenuitem = new JMenuItem(" Open"); 
    savemenuitem = new JMenuItem(" Save"); 
    exitmenuitem = new JMenuItem(" Exit"); 
} 
+0

謝謝布魯,它像一個老闆一樣工作:D –

0

您實例化區域之前添加的區域滾動窗格。只需切換滾動和區域實例化線。

area = new JTextArea();  
scroll = new JScrollPane (area,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

應該是足夠