如何更改JTabbedPane中的选项卡名称

时间:2014-11-25 10:23:40

标签: java focus jtextarea jtabbedpane

我想更改选项卡的名称保存创建的文档后,当我创建一个新文档时,光标没有放置/焦点在TextArea中,当我点击textarea然后只有它焦点。我怎么能得到自动焦点在Textarea.In我的应用程序中,当我创建一个新文档时,它打开一个空文档,标签名称为Doc 1 / Doc 2 / Doc 3 ....当我输入文本并通过“保存”菜单保存时,我想用给定的文件Name替换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 个答案:

答案 0 :(得分:0)

要获得对文本字段的关注,请使用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);
            }
        }
    }

}