Я создал класс объекта с именем 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, но без текста.Мне нужно мнение эксперта, который посоветует мне, что делать.Любая идея?