我正在尝试创建一个简单的文本编辑器,并且遇到了一个问题,试图使我的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) {}
}
}
}
}
}
你为什么要发布所有的代码?你的问题是关于一个JTextArea,JScrollPane和一个JFrame,所以用这三个组件来创建一个简单的例子来弄清楚它是如何实现的。您可以从阅读JTextArea API开始,您将在其中找到指向具有工作示例的“使用文本组件”的Swing教程的链接。或者您可以在论坛中搜索使用JTextArea的示例。 – camickr 2015-02-08 01:12:19
我在代码中的任何地方都看不到JScrollPane,所以我不确定问题在哪。 – Radiodef 2015-02-08 01:14:10
@Radiodef这是因为我不知道在哪里放置代码。我对Java非常新颖 – 2015-02-08 01:17:44