所以我有一个简单的文本编辑器,目前它的大多数功能都在工作,但是添加滚动条是我遇到麻烦的地方。我尝试通过添加到框架并从那里查找东西,但这只是删除了我键入或查看任何内容的能力。目前我正在添加内容窗格,但它似乎没有注册滚动条。此外,当它确实没有用时,文本区域的其余部分是不可编辑的。这是处理它的一小部分代码,你能帮我找到出错的地方。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import java.util.Scanner;
import java.io.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.Highlighter.HighlightPainter;
import javax.swing.text.JTextComponent;
import java.net.URI;
public class MyTextEditor extends JFrame implements ActionListener
{
private JFrame frame = new JFrame();
private JPanel panel = new JPanel(new BorderLayout());
private JTextArea textArea = new JTextArea(0,0);
private JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
private MenuBar menuBar = new MenuBar();
private Menu file = new Menu();
private Menu edit = new Menu();
private Menu find = new Menu();
private Menu goTo = new Menu();
private Menu help = new Menu();
private Menu prefs = new Menu();
//File
private MenuItem openFile = new MenuItem();
private MenuItem saveFile = new MenuItem();
private MenuItem closeFile = new MenuItem();
private MenuItem newFile = new MenuItem();
//Edit
private MenuItem copy = new MenuItem();
private MenuItem paste = new MenuItem();
private MenuItem cut = new MenuItem();
private MenuItem search = new MenuItem();
private MenuItem replace = new MenuItem();
//GoTo
private MenuItem goToLine = new MenuItem();
//Help
private MenuItem documentation = new MenuItem();
//Prefs
private MenuItem toggleLines = new MenuItem();
public MyTextEditor()
{
//Set the basis for the text editor
this.setSize(750,800);
frame.setTitle("Zenith");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea.setFont(new Font("Consolas", Font.BOLD, 14));
textArea.setForeground(Color.GREEN);
textArea.setBackground(Color.BLACK);
textArea.setCaretColor(Color.WHITE);
//scrollPane.setBounds(20, 30, 100, 40);
textArea.getCaret().setVisible(true);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(20,50));
//scrollPane.add(textArea);
scrollPane.setVisible(true);
//scrollPane.getHorizontalScrollBar().isVisible();
//scrollPane.getVerticalScrollBar().isVisible();
//textArea.add(scrollPane,BorderLayout.EAST);
// Line numbers
final LineNumberingTextArea lineNTA = new LineNumberingTextArea(textArea);
DocumentListener documentListen = new DocumentListener()
{
public void insertUpdate(DocumentEvent documentEvent)
{
lineNTA.updateLineNumbers();
}
public void removeUpdate(DocumentEvent documentEvent)
{
lineNTA.updateLineNumbers();
}
public void changedUpdate(DocumentEvent documentEvent)
{
lineNTA.updateLineNumbers();
}
};
textArea.getDocument().addDocumentListener(documentListen);
lineNTA.setBackground(Color.BLACK);
lineNTA.setForeground(Color.WHITE);
lineNTA.setFont(new Font("Consolas", Font.BOLD, 13));
lineNTA.setEditable(false);
lineNTA.setVisible(true);
getContentPane().add(lineNTA,BorderLayout.WEST);
getContentPane().add(scrollPane);
getContentPane().add(textArea);
//getContentPane().setLayout(new BorderLayout());
//scrollPane.setRowHeaderView(lineNTA);
//frame.getContentPane().add(textArea);
//panel.add(lineNumber,BorderLayout.EAST);
//Numbers along the side
setMenuBar(this.menuBar);
menuBar.add(this.file);
menuBar.add(this.edit);
menuBar.add(this.find);
menuBar.add(this.goTo);
menuBar.add(this.help);
menuBar.add(this.prefs);
file.setLabel("File");
find.setLabel("Find");
edit.setLabel("Edit");
goTo.setLabel("Goto");
help.setLabel("Help");
prefs.setLabel("Preferences");
答案 0 :(得分:3)
我看到你的代码有几个问题,但主要的是你似乎试图将JTextArea添加到GUI两次甚至三次:
首先将其添加到JScrollPane:
private JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
将JScrollPane添加到GUI
getContentPane().add(scrollPane);
但紧接着之后,您似乎只将JTextArea 添加 其JScrollPane添加到GUI:
getContentPane().add(textArea);
了解您只能将组件添加到GUI一次。如果您尝试第二次添加它,它将从之前的容器中删除,将其留空。不仅如此,通过以这种方式(内容窗格)向BorderLayout使用容器添加组件,您可以完全从GUI替换JScrollPane。
当您将JTextArea添加到LineNumberingTextArea构造函数中时,您可能还会在GUI中添加第三时间:
final LineNumberingTextArea lineNTA = new LineNumberingTextArea(textArea);
然后将LineNumberingTextArea对象添加到GUI:
getContentPane().add(lineNTA,BorderLayout.WEST);
我们不知道你的LineNumberingTextArea里面发生了什么,但是如果你将JTextArea添加到LineNumberingTextArea实例,然后如上所述将你的LineNumberingTextArea实例添加到GUI,那么你的实例再次增加了三倍重新尝试将JTextArea添加到容器中,这是两倍太多。
同样,您只能向GUI添加一次组件。
其他方面问题:
private JTextArea textArea = new JTextArea(0,0);
。使用这个构造函数更好的方法是通过传递更合理的值来更好地使JTextArea大小本身适当。
private JFrame frame = new JFrame();
你在上面调用方法:
frame.setTitle("Zenith");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
但永远不会添加任何内容或显示它。因为除了混淆之外没有任何其他目的,你应该摆脱一个JFrame或另一个。这再次表明你可能想要重新开始并以明确的目的开始清洁。
例如,一个简单的GUI演示:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.*;
public class SimpleScrollPaneGui extends JPanel {
private static final int ROWS = 25;
private static final int COLUMNS = 60;
private static final Color TA_BACKGRND = Color.BLACK;
private static final Color TA_FOREGRND = Color.GREEN;
private static final Color TA_CARET_COLOR = Color.WHITE;
private static final Font TA_FONT = new Font("Consolas", Font.BOLD, 14);
// first off size your JTextArea by setting visible rows and columns
private JTextArea textArea = new JTextArea(ROWS, COLUMNS);
public SimpleScrollPaneGui() {
// set the text area properties
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setBackground(TA_BACKGRND);
textArea.setForeground(TA_FOREGRND);
textArea.setCaretColor(TA_CARET_COLOR);
textArea.setFont(TA_FONT);
// create jscrollpane, passing in jtextarea into its viewport:
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
setLayout(new BorderLayout());
// add **just the jscrollpane to the GUI
add(scrollPane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
private static void createAndShowGui() {
SimpleScrollPaneGui mainPanel = new SimpleScrollPaneGui();
JFrame frame = new JFrame("Simple ScrollPane GUI");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}