2015-02-08 79 views
0

我正在嘗試創建一個簡單的文本編輯器,並且遇到了一個問題,試圖使我的JTextArea可以通過JScrollPane進行滾動。如何將JTextArea添加到JScrollPane?

我知道的傳統方法沒有奏效,所以我想知道這裏有沒有人可以幫忙。我不知道從哪裏開始,因此我將發佈我的整個代碼。我已經註釋了它以幫助顯示我的方法。

import javax.swing.*; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.text.*; 

import java.awt.*; 
import java.io.*; 
import java.awt.event.*; 
import java.util.Hashtable; 

@SuppressWarnings("serial") 
public class GrooveEditor extends JFrame { 

    private Action openAction = new OpenAction(); 
    private Action saveAction = new SaveAction(); 

    private JTextComponent textComp; 

    @SuppressWarnings({ "rawtypes", "unused" }) 
    private Hashtable actionHash = new Hashtable(); 

    public static void main(String[] args) { 
    GrooveEditor editor = new GrooveEditor(); 
    editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    editor.setVisible(true); 
    } 

    // Create editor. 
    public GrooveEditor() { 

    super("Groove Text Editor"); 
    textComp = createTextComponent(); 
    makeActionsPretty(); 

    Container content = getContentPane(); 
    content.add(textComp, BorderLayout.CENTER); 
    setJMenuBar(createMenuBar()); 
    setExtendedState(MAXIMIZED_BOTH); 
    } 

    // Create JTextComponent subclass. 
    private JTextComponent createTextComponent() { 
    JTextArea ta = new JTextArea(); 
    ta.setLineWrap(true); 
    ta.setMargin(new Insets(10,10,10,10)); 
    return ta; 
    } 

    protected void makeActionsPretty() { 
    Action a; 
    a = textComp.getActionMap().get(DefaultEditorKit.cutAction); 
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/cut.gif")); 
    a.putValue(Action.NAME, "Cut"); 

    a = textComp.getActionMap().get(DefaultEditorKit.copyAction); 
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/copy.gif")); 
    a.putValue(Action.NAME, "Copy"); 

    a = textComp.getActionMap().get(DefaultEditorKit.pasteAction); 
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/paste.gif")); 
    a.putValue(Action.NAME, "Paste"); 

    a = textComp.getActionMap().get(DefaultEditorKit.selectAllAction); 
    a.putValue(Action.NAME, "Select All"); 
    } 



    // Create a JMenuBar 
    protected JMenuBar createMenuBar() { 
    JMenuBar menubar = new JMenuBar(); 
    menubar.add(Box.createHorizontalStrut(10)); 
    JMenu file = new JMenu("File"); 
    JMenu edit = new JMenu("Edit"); 
    JMenu format = new JMenu("Format"); 

    menubar.add(file); 
    menubar.add(edit); 
    menubar.add(format); 

    file.add(getOpenAction()); 
    file.add(getSaveAction()); 
    file.add(new ExitAction()); 

    edit.add(textComp.getActionMap().get(DefaultEditorKit.cutAction)); 
    edit.add(textComp.getActionMap().get(DefaultEditorKit.copyAction)); 
    edit.add(textComp.getActionMap().get(DefaultEditorKit.pasteAction)); 
    edit.add(textComp.getActionMap().get(DefaultEditorKit.selectAllAction)); 

    return menubar; 
    } 

    // Subclass can override to use a different open action. 
    protected Action getOpenAction() { return openAction; } 

    // Subclass can override to use a different save action. 
    protected Action getSaveAction() { return saveAction; } 

    protected JTextComponent getTextComponent() { return textComp; } 

    // ********** ACTION INNER CLASSES ********** // 

    // A very simple exit action 
    public class ExitAction extends AbstractAction { 
    public ExitAction() { super("Exit"); } 
    @Override 
    public void actionPerformed(ActionEvent ev) { System.exit(0); } 
    } 

    // An action that opens an existing file 
    class OpenAction extends AbstractAction { 
    public OpenAction() { 
     super("Open", new ImageIcon("icons/open.gif")); 
    } 

    // Query user for a filename and attempt to open and read the file into the 
    // text component. 
    @Override 
    public void actionPerformed(ActionEvent ev) { 
     JFileChooser chooser = new JFileChooser(); 
     if (chooser.showOpenDialog(GrooveEditor.this) != 
      JFileChooser.APPROVE_OPTION) 
     return; 
     File file = chooser.getSelectedFile(); 
     if (file == null) 
     return; 

     FileReader reader = null; 
     try { 
     reader = new FileReader(file); 
     textComp.read(reader, null); 
     } 
     catch (IOException ex) { 
     JOptionPane.showMessageDialog(GrooveEditor.this, 
     "File Not Found", "ERROR", JOptionPane.ERROR_MESSAGE); 
     } 
     finally { 
     if (reader != null) { 
      try { 
      reader.close(); 
      } catch (IOException x) {} 
     } 
     } 
    } 
    } 

    // An action that saves the document to a file 
    class SaveAction extends AbstractAction { 
    public SaveAction() { 
     super("Save", new ImageIcon("icons/save.gif")); 
    } 

    // Query user for a filename and attempt to open and write the text 
    // component's content to the file. 
    @Override 
    public void actionPerformed(ActionEvent ev) { 
     JFileChooser chooser = new JFileChooser(); 
     chooser.addChoosableFileFilter(new FileNameExtensionFilter("Text Document", "txt")); 
     chooser.addChoosableFileFilter(new FileNameExtensionFilter("HTML", "html")); 

     if (chooser.showSaveDialog(GrooveEditor.this) != 
      JFileChooser.APPROVE_OPTION) 
     return; 

     @SuppressWarnings("unused") 

     String ext = ""; 
     String extension = chooser.getFileFilter().getDescription(); 

     if (extension == "txt") { 
      ext = ".txt"; 
     } 

     File file = chooser.getSelectedFile(); 
     if (file == null) 
     return; 

     FileWriter writer = null; 
     try { 
     writer = new FileWriter(file); 
     textComp.write(writer); 
     } 
     catch (IOException ex) { 
     JOptionPane.showMessageDialog(GrooveEditor.this, 
     "File Not Saved", "ERROR", JOptionPane.ERROR_MESSAGE); 
     } 
     finally { 
     if (writer != null) { 
      try { 
      writer.close(); 
      } catch (IOException x) {} 
     } 
     } 
    } 
    } 
} 
+2

你爲什麼要發佈所有的代碼?你的問題是關於一個JTextArea,JScrollPane和一個JFrame,所以用這三個組件來創建一個簡單的例子來弄清楚它是如何實現的。您可以從閱讀JTextArea API開始,您將在其中找到指向具有工作示例的「使用文本組件」的Swing教程的鏈接。或者您可以在論壇中搜索使用JTextArea的示例。 – camickr 2015-02-08 01:12:19

+0

我在代碼中的任何地方都看不到JScrollPane,所以我不確定問題在哪。 – Radiodef 2015-02-08 01:14:10

+0

@Radiodef這是因爲我不知道在哪裏放置代碼。我對Java非常新穎 – 2015-02-08 01:17:44

回答

2

您需要將您的文本組件添加到JScrollPane。例如,而不是:

content.add(textComp, BorderLayout.CENTER); 

使用:

content.add(new JScrollPane(textComp), BorderLayout.CENTER); 

欲瞭解更多詳情,請參閱How to Use Scroll Panes

+1

這是有效的。我只需要知道把它放在哪裏。從來沒有任何正式的編程培訓。 – 2015-02-08 01:16:24

+3

'從來沒有任何正式的編程培訓。「 - 這就是爲什麼你應該閱讀教程或搜索論壇。換句話說,學習簡單的問題解決技巧。 – camickr 2015-02-08 01:21:13