2016-03-09 2 views
-1

Итак, у меня есть простой текстовый редактор, и на данный момент большинство его функций работают, однако добавление полос прокрутки там, где у меня проблемы. Я пробовал искать вещи с добавлением к фрейму и оттуда, но это просто удаляет мою способность печатать или видеть что угодно. На данный момент я добавляю панель содержимого, но, похоже, она не регистрирует полосы прокрутки. Также, когда это происходит, они непригодны для использования, а остальная часть текстовой области неприменима. Вот небольшой код кода, который имеет дело с этим, не могли бы вы помочь мне найти, что происходит не так.В моей текстовой области полосы прокрутки не отображаются или работают

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

Пожалуйста, см редактировать ответить. Также, если это не отвечает на ваш вопрос, пожалуйста, создайте и опубликуйте действительный [mcve]. –

+0

См. Дополнительные изменения для ответа, включая код. Опять же, если вы застряли, создайте и опубликуйте свой [mcve]. Пример этого типа кода отправлен с моим ответом. –

+0

Отредактировано в 3-й раз. Прокомментируйте, пожалуйста, какие-либо вопросы или недоразумения с моим ответом. –

ответ

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

Поймите, что вы можете добавить компонент графического интерфейса пользователя только один раз. Если вы попытаетесь добавить его во второй раз, он будет удален из предыдущего контейнера, оставив его пустым. Не только это, добавив компонент в контейнер BorderLayout таким образом (панель содержимого), вы полностью замените JScrollPane из графического интерфейса.

Вы также можете добавлять в JTextArea к GUI в третий раз, когда вы добавляете его в свой LineNumberingTextArea конструктор:

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, по умолчанию, несколько раз, что означает, что вы перемещаете какой-либо компонент, добавленный ранее с недавно добавленными компонентами, что, вероятно, еще больше запутывает вы.
  • Вы создаете два JFrames - почему? Один из них - это когда вы создаете экземпляр MyTextEditor, поскольку он распространяется из JFrame. Это JFrame, который получает все компоненты. Другой частный поле:

private JFrame frame = new JFrame(); 

и вы называете его методы:

frame.setTitle("Zenith"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

но никогда не добавляйте ничего к нему или отобразить его. Поскольку это не будет служить никакой цели, кроме как запутать вас, вы должны избавиться от одного JFrame или другого. Опять же, это говорит о том, что вы, возможно, захотите начать все сначала и начать чище и с четко определенной целью.



Например, простой графический интерфейс демо:

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); 
    } 
} 
Смежные вопросы