Search code examples
javafocusjtextareajtabbedpane

How To Change The Tab Name in JTabbedPane


I want to change the Name of the tab After save an created Document and when I create a New Document the cursor is not placing/focus in TextArea,when I click on textarea then only it focus.How can I achive Auto focus on Textarea.In My Application when I create a new Document,It open with a Empty Doc with the Tab name of Doc 1/Doc 2/Doc 3....When I enter a Text and save through "Save" menu Item,I want to replace Doc 1 with the given file Name.Please Check it Both.Thank you.

My Code:

public class TabbedPaneFocus extends javax.swing.JFrame {

JTextArea textArea;
int i=0;
JTabbedPane tabbedPane;
public TabbedPaneFocus() {

    initComponents();
    tabbedPane=new CloseButtonTabbedPane();
    add(tabbedPane);
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 512, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 366, Short.MAX_VALUE)
    );
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    create = new javax.swing.JMenuItem();
    save = new javax.swing.JMenuItem();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");

    create.setText("Create");
    create.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            createActionPerformed(evt);
        }
    });
    jMenu1.add(create);

    save.setText("Save");
    save.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            saveActionPerformed(evt);
        }
    });
    jMenu1.add(save);

    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 512, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 366, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

private void createActionPerformed(java.awt.event.ActionEvent evt) {                                       
    try{
        i++;
        textArea = new JTextArea();
        textArea.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
        JScrollPane  scrollpane=new JScrollPane(textArea);
        tabbedPane.add(scrollpane);
        tabbedPane.addTab("Doc "+i, scrollpane);
        tabbedPane.setSelectedIndex(i-1);
        tabbedPane.setFocusable(true);
    }
   catch(ArrayIndexOutOfBoundsException aio){   
   }
}                                      

private void saveActionPerformed(java.awt.event.ActionEvent evt) {                                     
    int chooserStatus;
    String filename = null;
    int index=tabbedPane.getSelectedIndex();
    String name=tabbedPane.getTitleAt(index);
        if(name.isEmpty() || name.startsWith("Doc ")){
            JFileChooser chooser = new JFileChooser();
            chooser.setPreferredSize( new Dimension(450, 400) );
            chooserStatus = chooser.showSaveDialog(this);
            if (chooserStatus == JFileChooser.APPROVE_OPTION) {
                File selectedFile = chooser.getSelectedFile();            
                if (!selectedFile.getName().endsWith(".txt")) {
                    selectedFile = new File(selectedFile.getAbsolutePath() + ".txt");
                }
                filename = selectedFile.getPath();
                tabbedPane.setTitleAt(index, selectedFile.getName());
            }
            else{
                return;
            }
        }      
        boolean success;
        String editorString;
        FileWriter fwriter;
        PrintWriter outputFile;
        try {
            DataOutputStream d = new DataOutputStream(new FileOutputStream(filename));
            String line = textArea.getText();
            BufferedReader br = new BufferedReader(new StringReader(line));
            while((line = br.readLine())!=null) {
                d.writeBytes(line + "\r\n");
            }
        }
        catch (IOException e) {       
            success = false;
        }
        success = true;
}                                    

public static void main(String args[]) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new TabbedPaneFocus().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JMenuItem create;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem save;
// End of variables declaration                   

public class CloseButtonTabbedPane extends JTabbedPane {
public CloseButtonTabbedPane() {
}
public void addTab(String title, Icon icon, Component component, String tip) {
    super.addTab(title, icon, component, tip);
    int count = this.getTabCount() - 1;
    setTabComponentAt(count, new CloseButtonTab(component, title, icon));
}
public void addTab(String title, Icon icon, Component component) {
    addTab(title, icon, component, null);
}
public void addTab(String title, Component component) {
    addTab(title, null, component);
}
public class CloseButtonTab extends JPanel {
    private Component tab;
    public CloseButtonTab(final Component tab, String title, Icon icon) {
        this.tab = tab;
        setOpaque(false);
        FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3);
        setLayout(flowLayout);
        setVisible(true);
        JLabel jLabel = new JLabel(title);
        jLabel.setIcon(icon);
        add(jLabel);
        JButton button = new JButton(MetalIconFactory.getInternalFrameCloseIcon(16));
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
        button.addMouseListener(new MouseListener() {
                        int index;
            public void mouseClicked(MouseEvent e) {
                                    tabbedPane.remove(tabbedPane.getSelectedIndex());
                                    i--;
            }
            public void mousePressed(MouseEvent e) {
            }
            public void mouseReleased(MouseEvent e) {
            }
            public void mouseEntered(MouseEvent e) {
                JButton button = (JButton) e.getSource();
                button.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
            }
            public void mouseExited(MouseEvent e) {
                JButton button = (JButton) e.getSource();
                button.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
            }
        });
        add(button);
    }
 }
}
}

In My SaveAction code I write the code to change the tab name with saved file name but not apply.
 tabbedPane.setTitleAt(index, selectedFile.getName()); 

Solution

  • For gaining focus on the text field use requestFocus. You should keep a reference to the JLabel of the tab that you add with addTab to change the title of the tab later. So you need to keep a reference to the tab itself. You can try something like this. I modified a few lines and commented them, so you can find them easier.

    Note: I've just did a simple extension, so you can see how it could be done. You may need to handle the bookkeeping of the ArrayList of tabs more carefully, especially with deletion of individual tabs. You should do some tests. Moreover you should handle the case when you click save when there is no tab created yet. You get an ArrayIndexOutOfBoundsException at the moment.

    public class TabbedPaneFocus extends javax.swing.JFrame
    {
    
        JTextArea textArea;
        int i = 0;
        CloseButtonTabbedPane tabbedPane;
    
        public TabbedPaneFocus()
        {
    
            initComponents();
            tabbedPane = new CloseButtonTabbedPane();
            add(tabbedPane);
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
                    getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                    tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING,
                    javax.swing.GroupLayout.DEFAULT_SIZE, 512, Short.MAX_VALUE));
            layout.setVerticalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                    tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 366,
                    Short.MAX_VALUE));
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents()
        {
    
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            create = new javax.swing.JMenuItem();
            save = new javax.swing.JMenuItem();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jMenu1.setText("File");
    
            create.setText("Create");
            create.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    createActionPerformed(evt);
                }
            });
            jMenu1.add(create);
    
            save.setText("Save");
            save.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    saveActionPerformed(evt);
                }
            });
            jMenu1.add(save);
    
            jMenuBar1.add(jMenu1);
    
            setJMenuBar(jMenuBar1);
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
                    getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 512,
                    Short.MAX_VALUE));
            layout.setVerticalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 366,
                    Short.MAX_VALUE));
    
            pack();
        }// </editor-fold>
    
        private void createActionPerformed(java.awt.event.ActionEvent evt)
        {
            try
            {
                i++;
                textArea = new JTextArea();
                textArea.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
                JScrollPane scrollpane = new JScrollPane(textArea);
                //tabbedPane.add(scrollpane); Remove this line. you only need the scroll pane in the tab
                tabbedPane.addTab("Doc " + i, scrollpane);
                tabbedPane.setSelectedIndex(i - 1);
                tabbedPane.setFocusable(true);
                textArea.requestFocus(); // Here you gain focus on text area of the new tab
            }
            catch (ArrayIndexOutOfBoundsException aio)
            {
            }
        }
    
        private void saveActionPerformed(java.awt.event.ActionEvent evt)
        {
            int chooserStatus;
            String filename = null;
            int index = tabbedPane.getSelectedIndex();
            String name = tabbedPane.getTitleAt(index);
            if (name.isEmpty() || name.startsWith("Doc "))
            {
                JFileChooser chooser = new JFileChooser();
                chooser.setPreferredSize(new Dimension(450, 400));
                chooserStatus = chooser.showSaveDialog(this);
                if (chooserStatus == JFileChooser.APPROVE_OPTION)
                {
                    File selectedFile = chooser.getSelectedFile();
                    if (!selectedFile.getName().endsWith(".txt"))
                    {
                        selectedFile = new File(selectedFile.getAbsolutePath()
                                + ".txt");
                    }
                    filename = selectedFile.getPath();
                    // tabbedPane.setTitleAt(index, selectedFile.getName()); -> Replace this line
    
                    // Set a new title by accessing the tab and the title label
                    tabbedPane.tabs.get(index).tabTitle.setText(selectedFile.getName());
                }
                else
                {
                    return;
                }
            }
            boolean success;
            String editorString;
            FileWriter fwriter;
            PrintWriter outputFile;
            try
            {
                DataOutputStream d = new DataOutputStream(new FileOutputStream(
                        filename));
                String line = textArea.getText();
                BufferedReader br = new BufferedReader(new StringReader(line));
                while ((line = br.readLine()) != null)
                {
                    d.writeBytes(line + "\r\n");
                }
            }
            catch (IOException e)
            {
                success = false;
            }
            success = true;
        }
    
        public static void main(String args[])
        {
            try
            {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
                        .getInstalledLookAndFeels())
                {
                    if ("Nimbus".equals(info.getName()))
                    {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            }
            catch (ClassNotFoundException ex)
            {
                java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            }
            catch (InstantiationException ex)
            {
                java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            }
            catch (IllegalAccessException ex)
            {
                java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            }
            catch (javax.swing.UnsupportedLookAndFeelException ex)
            {
                java.util.logging.Logger.getLogger(TabbedPaneFocus.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            }
            java.awt.EventQueue.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    new TabbedPaneFocus().setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify
        private javax.swing.JMenuItem create;
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JMenuItem save;
    
        // End of variables declaration
    
        public class CloseButtonTabbedPane extends JTabbedPane
        {
            public CloseButtonTabbedPane()
            {
            }
    
            // ArrayList to keep track of all created tabs
            ArrayList<CloseButtonTab> tabs = new ArrayList<CloseButtonTab>();
    
            public void addTab(String title, Icon icon, Component component,
                    String tip)
            {
                super.addTab(title, icon, component, tip);
                int count = this.getTabCount() - 1;
                CloseButtonTab tab  = new CloseButtonTab(component, title, icon);
                setTabComponentAt(count, tab);
                tabs.add(tab); // Add the new tab to later modify the title
            }
    
            public void addTab(String title, Icon icon, Component component)
            {
                addTab(title, icon, component, null);
            }
    
            public void addTab(String title, Component component)
            {
                addTab(title, null, component);
            }
    
            public class CloseButtonTab extends JPanel
            {
                private Component tab;
                JLabel tabTitle; // Saves the title, modify this label to set a new title
    
                public CloseButtonTab(final Component tab, String title, Icon icon)
                {
                    this.tab = tab;
                    setOpaque(false);
                    FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3);
                    setLayout(flowLayout);
                    setVisible(true);
                    tabTitle = new JLabel(title); // Set the tab title
                    tabTitle.setIcon(icon);
                    add(tabTitle);
                    JButton button = new JButton(
                            MetalIconFactory.getInternalFrameCloseIcon(16));
                    button.setMargin(new Insets(0, 0, 0, 0));
                    button.setBorder(BorderFactory.createLineBorder(
                            Color.LIGHT_GRAY, 1));
                    button.addMouseListener(new MouseListener()
                    {
                        int index;
    
                        public void mouseClicked(MouseEvent e)
                        {
                            tabbedPane.remove(tabbedPane.getSelectedIndex());
                            i--;
                        }
    
                        public void mousePressed(MouseEvent e)
                        {
                        }
    
                        public void mouseReleased(MouseEvent e)
                        {
                        }
    
                        public void mouseEntered(MouseEvent e)
                        {
                            JButton button = (JButton) e.getSource();
                            button.setBorder(BorderFactory.createLineBorder(
                                    Color.RED, 1));
                        }
    
                        public void mouseExited(MouseEvent e)
                        {
                            JButton button = (JButton) e.getSource();
                            button.setBorder(BorderFactory.createLineBorder(
                                    Color.LIGHT_GRAY, 1));
                        }
                    });
                    add(button);
                }
            }
        }
    
    }