2015-02-08 115 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