Как добавить JLabel в существующий JTextField

1

Я хочу добавить метку Capslock в статус JtextField. Статус имеет значения строк и столбцов. Я хочу добавить caplock с строкой и столбцом. Я попытался добавить updateStatus(), но он не работает updateStatus().

Образец кода:

public class CapsLock extends javax.swing.JFrame {
    JTextField status;
    int i=0;
    JTextArea textArea;
    JLabel capsLock;
    public CapsLock() {
        initComponents();
        status=new JTextField();
        capsLock=new JLabel();
        updateStatus(1,1);
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        tabbedPane = new javax.swing.JTabbedPane();
        jMenuBar1 = new javax.swing.JMenuBar();
        file = new javax.swing.JMenu();
        newFile = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        file.setText("File");

        newFile.setText("NewFile");
        newFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newFileActionPerformed(evt);
            }
        });
        file.add(newFile);

        jMenuBar1.add(file);

        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, 400, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 279, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        
    private void updateStatus(int linenumber, int columnnumber) {
        status.setText("ln: " + linenumber + " Col: " + columnnumber);
     }
    private void newFileActionPerformed(java.awt.event.ActionEvent evt) {                                        
        final JInternalFrame internalFrame = new JInternalFrame("");
        i++;
        internalFrame.setName("Doc "+i);
        internalFrame.setClosable(true);
        internalFrame.setAutoscrolls(true);
        textArea=new JTextArea();
        textArea.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent ke) {
            }

            @Override
            public void keyPressed(KeyEvent ke) {
              if(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)){
                   capsLock.setText("ON");
              }
              else{
                    capsLock.setText("OFF");
                    status.setText(capsLock.getText());
              }  
            }
            @Override
            public void keyReleased(KeyEvent ke) {
            }
        });
        textArea.addCaretListener(new CaretListener() {
        @Override
        public void caretUpdate(CaretEvent e) {
              JTextArea editArea = (JTextArea)e.getSource();
              int linenum = 1;
              int columnnum = 1;
               try {
                    int caretpos = editArea.getCaretPosition();
                    linenum = editArea.getLineOfOffset(caretpos);
                    columnnum = caretpos - editArea.getLineStartOffset(linenum);
                    linenum += 1;
                }
                catch(Exception ex) { }
                updateStatus(linenum, columnnum);
            }
        });

        status.setBackground(Color.LIGHT_GRAY);
        status.setEditable(false);
        internalFrame.add(textArea);
        internalFrame.add(status,BorderLayout.SOUTH);
        tabbedPane.add(internalFrame);
    }                                       

    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(CapsLock.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(CapsLock.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(CapsLock.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(CapsLock.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new CapsLock().setVisible(true);
            }
        });
    }

    private javax.swing.JMenu file;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem newFile;
    private javax.swing.JTabbedPane tabbedPane;                
}

Я пишу класс StatusPanel, как показано ниже:

public class StatusPanel extends JPanel{

InternalFrame currentFrame;
private JLabel statusLabel;
JLabel capsLabel;
public StatusPanel(){
    statusLabel=new JLabel();
    capsLabel=new JLabel();
    add(statusLabel);
    add(capsLabel);
    updateStatus(1,1);
}
public void setRowColumn(){
    currentFrame.textPane.addCaretListener(new CaretListener() {
        private KeyEvent KeyEvent;
        @Override
        public void caretUpdate(CaretEvent e) {

            int linenum = 1;
            int columnnum = 1;
            try {
                int caretpos = currentFrame.textPane.getCaretPosition();
                linenum=currentFrame.getLineAtCaret()-1;
                columnnum=currentFrame.getColumnAtCaret();
                linenum += 1;
            }
            catch(Exception ex) { }
            updateStatus(linenum, columnnum);
        }
    });      
}
private void updateStatus(int linenumber, int columnnumber) 
{
    statusLabel.setText("Line: " + linenumber +"  "+ " Column: " + columnnumber);
}
public void setCapslock(){
    currentFrame.textPane.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent ke) {
            //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void keyPressed(KeyEvent ke) {
            if(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)){
               capsLabel.setText("    CAPS ON");
    }
            else{
                capsLabel.setText("    CAPS OFF");
            }
        }

        @Override
        public void keyReleased(KeyEvent ke) {
            //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }); 
}
}
  • 0
    Дайте мне обзор, чтобы сделать эту задачу.
Теги:
swing
awt
jlabel
jtextfield

1 ответ

1
Лучший ответ
  1. В коде "if" у вас есть один оператор. В инструкции "else" у вас есть 2 оператора. Разве вы не думаете, что код должен быть тем же, кроме текста?

  2. Кроме того, вы не должны использовать текстовое поле для отображения текста. Вместо этого вы должны использовать панель с несколькими ярлыками. Одна метка для позиции строки/столбца. Другой ярлык статуса Caps Lock. Затем вы обновляете только текст для изменяемого ярлыка.

. Блокировка/блокировка блокировки не обновляет все открытые документы.

Тогда у вас есть несколько решений:

  1. Строка состояния должна быть общей для фрейма, а не для документа. Таким образом, ярлыки будут доступны всем документам. Это означает, что всякий раз, когда документ получает фокус, вам нужно будет обновить позицию каретки, но Caps Lock по-прежнему будет правильным из последнего документа.

  2. Или вы можете создать поле Caps Lock как нередактируемый JTextField. Затем вы можете разделить Документ текстового поля со всем текстовым полем. Это означает, что при обновлении текстового поля оно будет отражено во всех документах.

Таким образом, вам нужно будет передать документ общего текстового поля в любое время, когда вы создадите новый документ для своего приложения. Затем, чтобы создать текстовое поле, вы должны использовать:

JTextField textField = new JTextField( sharedDocument );

Редактировать:

Когда вы создаете компонент для фрейма, у вас будет код вроде:

StatusPanel status = new StatusPanel();
frame.add(status, ...);

Затем в этом пользовательском классе вы добавляете компоненты для отображения отображаемых данных. Вам также необходимо добавить такие методы, как setRowColumn(...) и setCapsLock(...) чтобы отобразить текст, который вы хотите увидеть для этих компонентов.

Затем вам нужно создать еще один пользовательский класс MyInternalFrame который расширяет JInternalFrame. Затем, когда вы создаете этот класс, вы используете:

MyInternalFrame internal = new MyInternalFrame(status);

Итак, теперь ваш пользовательский внутренний кадр имеет доступ к строке состояния, и вы можете обновить строку состояния из любого документа, созданного вами.

Другое Редактировать:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class Status extends JPanel
{
    public Status()
    {
        setLayout( new BorderLayout() );

        StatusPanel status = new StatusPanel();
        add(status, BorderLayout.SOUTH);

        DocumentPanel document = new DocumentPanel( status );
        add(document, BorderLayout.CENTER);
    }

    class StatusPanel extends JPanel
    {
        JLabel caretStatus = new JLabel("Caret Offset: 0");

        public StatusPanel()
        {
            add( caretStatus );
        }

        public void updateCaretStatus(String status)
        {
            caretStatus.setText( status );
        }
    }

    class DocumentPanel extends JPanel
    {
        private StatusPanel status;
        private JTextArea textArea;

        public DocumentPanel(StatusPanel statusPanel)
        {
            status = statusPanel;

            textArea = new JTextArea(5, 30);
            add( new JScrollPane( textArea ) );

            textArea.addCaretListener( new CaretListener()
            {
                @Override
                public void caretUpdate(CaretEvent e)
                {
                    status.updateCaretStatus( "Caret Offset: " + textArea.getCaretPosition() );
                }
            });
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Status");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new Status() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
  • 0
    Спасибо. Я изменил My JTextField на JPanel. Работает нормально.
  • 0
    Он работает нормально. Я использую JPanel вместо JTextField. Но я хочу установить метку capsLock в конец панели (справа). Пожалуйста, проверьте это.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню