Может кто-нибудь подскажите, пожалуйста, почему исчез мой текст и как его решить? - PullRequest
0 голосов
/ 22 октября 2018

Я создал класс объекта с именем JLabeledComponentField, как вы можете видеть, и поместил его в JPanel с другими идентичными объектами.Вот пример кода

class JLabeledComponentField extends JPanel{
private JLabel jLabel;
private JComponent comp;
private boolean editable;

public JLabeledComponentField(JComponent Comp) {
    jLabel = new JLabel();
    jLabel.setBorder(BorderFactory.createLineBorder(new Color(122,138,153)));
    jLabel.setOpaque(true);
    jLabel.setBackground(Color.white);
    jLabel.setHorizontalAlignment(SwingConstants.CENTER);

    onClicked_Label(jLabel);
    comp = Comp;
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
    {
        ((JTextField)comp).setUI(new MetalTextFieldUI());
        ((JTextField)comp).setBorder(BorderFactory.createLineBorder(new Color(122,138,153)));
    }
    editable = true;
    onExit_TextField();
    setLayout(new BorderLayout());
    add(jLabel,BorderLayout.CENTER);
}
private void onExit_TextField() {
    comp.addFocusListener(new FocusListener(){
        public void focusGained(FocusEvent arg0) {
        }
        public void focusLost(FocusEvent arg0) {
            set();
            remove(comp);//remove component
            add(jLabel, BorderLayout.CENTER);//
            //refresh JFrame
            revalidate();
            repaint();
        }
    });
}

private void onClicked_Label(JLabel lbl) {
    lbl.addMouseListener(new MouseListener(){
        public void mouseClicked(MouseEvent mouseEvent)
        {
            if(editable)
            {
                remove(jLabel);//remove component
                add(comp, BorderLayout.CENTER);//
                comp.requestFocus();

                //refresh JFrame
                revalidate();
                repaint();
            }
        }
        public void mouseEntered(MouseEvent mouseEvent) {}
        public void mouseExited(MouseEvent mouseEvent) {}
        public void mousePressed(MouseEvent mouseEvent){}
        public void mouseReleased(MouseEvent mouseEvent){}
    });
}
private void set()
{
    if(comp.getClass().toString().equals("class javax.swing.JComboBox"))
    {
        String text = ((JComboBox)comp).getSelectedItem().toString();
        jLabel.setText(text);
    }
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
    {
        String text = ((JTextField)comp).getText();
        jLabel.setText(text);
    }
}
public void setColor(String text)
{
    if(text.equals(""))
        changeColor();
    else
        returnColor();
}
public void changeColor()
{
    jLabel.setBackground(Color.yellow);
    comp.setBackground(Color.yellow);
}
public void returnColor()
{
    jLabel.setBackground(Color.gray);
    comp.setBackground(Color.gray);
}
public void setSelectedItem(String text)throws Exception
{
    if(comp.getClass().toString().equals("class javax.swing.JComboBox"))
    {
        jLabel.setText(text);
        ((JComboBox)comp).setSelectedItem(text);
    }
    else
        throw new Exception("Exception occered : it's not JComboBox, its "+comp.getClass().toString());
}
public void setText(String text)throws Exception
{
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
    {
        jLabel.setText(text);
        ((JTextField)comp).setText(text);
        jLabel.setToolTipText(text);
        ((JTextField)comp).setToolTipText(text);

    }
    else
        throw new Exception("Exception occered : it's not JTextField, its "+comp.getClass().toString());
}
public String getSelectedItem()throws Exception
{
    if(comp.getClass().toString().equals("class javax.swing.JComboBox"))
        return ((JComboBox)comp).getSelectedItem().toString();
    else
        throw new Exception("Exception occered : it's not JComboBox, its "+comp.getClass().toString());
}
public String getText()throws Exception
{
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
        return jLabel.getText();
    else
        throw new Exception("Exception occered : it's not JTextField, its "+comp.getClass().toString());
}
public void setEditable(boolean bool)throws Exception
{
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class javax.swing.JComboBox"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
    {
        editable = bool;
        SetEnabled(bool);
    }
    else
        throw new Exception("Exception occered : it's not selected component, its "+comp.getClass().toString());
}
public void SetEnabled(boolean bool)throws Exception
{
    if((comp.getClass().toString().equals("class FixedLengthTextField"))||(comp.getClass().toString().equals("class javax.swing.JFormattedTextField"))||(comp.getClass().toString().equals("class javax.swing.JComboBox"))||(comp.getClass().toString().equals("class personalDetails$changedColoredFixedLengthTextField")))
    {
        jLabel.setEnabled(bool);
    }
    else
        throw new Exception("Exception occered : it's not selected component, its "+comp.getClass().toString());
}
public void SetFocus()
{
        if(editable)
        {
            remove(jLabel);//remove component
            add(comp, BorderLayout.CENTER);//
            comp.requestFocus();

            //refresh JFrame
            revalidate();
            repaint();
        }
}}

и, как вы можете видеть после того, как у меня есть код, я вызываю его и помещаю объект в jpanel.

JLabeledComponentField name = new JLabeledComponentField(new JTextfield());
JP.add(name);

Он работает нормально и действительночисто, но ... Затем, когда я дважды щелкаю по компоненту и поле JText заменяет JLabel, текст как-то исчезает примерно в 50% случаев, чего не происходит, и похоже, что он попадает в какую-то зону, котораямы все еще можем видеть поле JText, но без текста.Мне нужно мнение эксперта, который посоветует мне, что делать.Любая идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...