James L.
James L.

Reputation: 141

JTabbedPane does not add more than 1 tab when using .addTab()

I am wondering why the JTabbedPane only adds 1 tab. When I use the method addTab and then reuse it to create a new tab, it overrides the first tab created. Here is the code: BTW, most of the code that might be related to the problem is at actionlistener.

package com.james.client;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.Element;

public class Main extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String [] args)
{
    //JTextArea
    final JTextArea code = new JTextArea();
    final JTextArea lines = new JTextArea("1");
    final JScrollPane scroll = new JScrollPane(code);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    lines.setBackground(Color.LIGHT_GRAY);
    lines.setEditable(false);

    code.getDocument().addDocumentListener(new DocumentListener(){
        public String getText(){
            int caretPosition = code.getDocument().getLength();
            Element root = code.getDocument().getDefaultRootElement();
            String text = "1" + System.getProperty("line.separator");
            for(int i = 2; i < root.getElementIndex( caretPosition ) + 2; i++){
                text += i + System.getProperty("line.separator");
            }
            return text;
        }
        @Override
        public void changedUpdate(DocumentEvent de) {
            lines.setText(getText());
        }

        @Override
        public void insertUpdate(DocumentEvent de) {
            lines.setText(getText());
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            lines.setText(getText());
        }

    });

    scroll.getViewport().add(code);
    scroll.setRowHeaderView(lines);

    //JFrame
    JFrame window = new JFrame("MinecraftProgrammer++");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(1000, 700);
    window.setResizable(false);
    window.setLocationRelativeTo(null);

    //JMenuBar
    JMenuBar menu = new JMenuBar();
    JMenu file = new JMenu("File");
    JMenu newfile = new JMenu("New");

    //JTabbedPane
    final JTabbedPane tabs = new JTabbedPane();
    tabs.setBackground(Color.gray);

    //JMenu items
    JMenuItem classfile = new JMenuItem("Class");
    JMenuItem packagefolder = new JMenuItem("Package");
    JMenuItem other = new JMenuItem("Other");
    JMenuItem open = new JMenuItem("Open");
    open.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
          try {
            JFileChooser chooseFile = new JFileChooser();
            chooseFile.setAcceptAllFileFilterUsed(false);
            FileFilter filter1 = new ExtensionFileFilter("Java Class", new String[] {"JAVA"});
            FileFilter filter2 = new ExtensionFileFilter("Text File", new String[] {"TXT"});
            chooseFile.setFileFilter(filter2);
            chooseFile.setFileFilter(filter1);
            chooseFile.showOpenDialog(chooseFile);
            String filePath = chooseFile.getSelectedFile().getAbsolutePath();
            FileReader readFile = new FileReader(filePath);
            String fileName = chooseFile.getSelectedFile().getName();
            tabs.addTab(fileName, scroll);
            @SuppressWarnings("resource")
            Scanner fileReaderScan = new Scanner(readFile);
            String storeAllString = "";
             while(fileReaderScan.hasNextLine())
             {
                 String temp = fileReaderScan.nextLine() + "\n";
                 storeAllString = storeAllString + temp;
             }

             code.setText(storeAllString);
             code.setLineWrap(true);
             code.setWrapStyleWord(true);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println(e);
        }

        }   
    });
    JMenuItem save = new JMenuItem("Save");
    JMenuItem saveas = new JMenuItem("Save As...");

    //Compile menu bar
    file.add(newfile);
    file.add(open);
    file.add(save);
    file.add(saveas);
    newfile.add(classfile);
    newfile.add(packagefolder);
    newfile.add(other);
    menu.add(file);


    window.add(tabs);
    window.setJMenuBar(menu);
    window.setVisible(true);
}

}

Upvotes: 1

Views: 957

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285440

You're adding the JScrollPane "scroll" to the JTabbedPane. How many times do you construct this component? Answer -- once only. So you're only adding and re-adding the same component every time.

final JScrollPane scroll = new JScrollPane(code); // here you create scroll

// .....

open.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
      try {
        JFileChooser chooseFile = new JFileChooser();

        // ....

        // you add the same component here
        tabs.addTab(fileName, scroll);

        // ....

    }

Since you can't add a component to a container more than once and see it in both containers, the solution is to create any components needed for the new tab inside of the ActionListener's actionPerformed(...) method each time you need to add something to the JTabbedPane.

Upvotes: 3

Related Questions