在我的文本区域中,滚动条似乎不可见或有效

时间:2016-03-09 19:51:29

标签: java swing jframe jtextarea

所以我有一个简单的文本编辑器,目前它的大多数功能都在工作,但是添加滚动条是我遇到麻烦的地方。我尝试通过添加到框架并从那里查找东西,但这只是删除了我键入或查看任何内容的能力。目前我正在添加内容窗格,但它似乎没有注册滚动条。此外,当它确实没有用时,文本区域的其余部分是不可编辑的。这是处理它的一小部分代码,你能帮我找到出错的地方。

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");

1 个答案:

答案 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添加一次组件。

其他方面问题:

  • 您正在尝试设置组件的大小或首选大小,这是您希望避免的。相反,让组件和布局管理器将自己调整为最佳尺寸。
  • 您将JTextArea行和列属性设置为太小的值0,0:private JTextArea textArea = new JTextArea(0,0);。使用这个构造函数更好的方法是通过传递更合理的值来更好地使JTextArea大小本身适当。
  • 您还要以默认方式多次向BorderLayout使用容器(contentPane)添加组件,这意味着您将使用新添加的组件替换先前添加的任何组件,这可能会进一步混淆您。
  • 您正在创建两个JFrame - 为什么?一个是你创建MyTextEditor实例的时候,因为它是从JFrame扩展的。这是获取所有组件的JFrame。另一个是私人领域:

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);
    }
}