Как изменить имя вкладки в JTabbedPane

Я хочу изменить имя вкладки. После сохранения созданного документа и при создании нового документа курсор не помещается / не фокусируется в TextArea, когда я щелкаю текстовую область, а затем фокусируюсь только на ней. Как можно добиться автоматической фокусировки на текстовой области. В моем приложении, когда я создаю новый документ, он открывается с пустым документом с именем вкладки Doc 1/Doc 2/Doc 3.... Когда я ввожу текст и сохраняю через пункт меню "Сохранить", я хочу замените Doc 1 на указанное имя файла. Пожалуйста, проверьте его. Спасибо.

Мой код:

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

1 ответ

Решение

Для фокусировки на текстовом поле используйте requestFocus, Вы должны сохранить ссылку на JLabel вкладки, которую вы добавляете addTab изменить название вкладки позже. Так что вам нужно сохранить ссылку на саму вкладку. Вы можете попробовать что-то вроде этого. Я изменил несколько строк и прокомментировал их, чтобы вам было проще их найти.

Примечание: я только что сделал простое расширение, чтобы вы могли увидеть, как это можно сделать. Возможно, вам придется вести бухгалтерский учет ArrayList из вкладок более тщательно, особенно с удалением отдельных вкладок. Вы должны сделать несколько тестов. Более того, вы должны обрабатывать случай, когда вы нажимаете сохранить, когда еще нет созданной вкладки. Вы получаете ArrayIndexOutOfBoundsException в данный момент.

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

}
Другие вопросы по тегам