Как изменить имя вкладки в 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);
}
}
}
}