I made a combination of a JTextField and a JLabel, because I want something that allows text input but doesn't stay ugly-looking like a JTextField when not in use. So, I came up with this class...

class LabelField (LabelField.java)
package gui;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
 
/**
 *
 * @author Tommy
 */
public class LabelField extends JPanel {
   private static GridBagConstraints C = new GridBagConstraints();
   static {
      C.gridx = 1;
      C.gridy = 1;
      C.ipadx = 10;
      C.ipady = 10;
   }
   private static final Border DB = BorderFactory.createEmptyBorder(1, 1, 1, 1);
   private static final Border HB = BorderFactory.createLineBorder(Color.GRAY, 1);
   private static final Color DC = null;
   private static final Color HC = Color.WHITE;
   private final MouseAdapter MA = new MouseAdapter() {
      public void mouseEntered(MouseEvent e) {
         l.setBackground(HC);
         l.setBorder(HB);
      }
 
      public void mouseExited(MouseEvent e) {
         showLabel();
         l.setBackground(DC);
         l.setBorder(DB);
      }
 
      public void mouseClicked(MouseEvent e) {
         showTextField();
         tf.requestFocusInWindow();
      }
   };
   private final DocumentListener DA = new DocumentListener() {
      public void changedUpdate(DocumentEvent e) {
         update();
      }
 
      public void insertUpdate(DocumentEvent e) {
         update();
      }
 
      public void removeUpdate(DocumentEvent e) {
         update();
      }
 
      private void update() {
         l.setText(tf.getText());
      }
   };
 
   private JLabel l;
   private JTextField tf;
   private int width;
   private boolean labelIsShowing;
   private boolean resetFieldTextOnFocus;
 
   public LabelField() {
      this("");
   }
 
   public LabelField(int width) {
      this("", width);
   }
 
   public LabelField(String text) {
      this(text, true);
   }
 
   public LabelField(String text, int width) {
      this(text, true, width);
   }
 
   public LabelField(String text, boolean resetFieldTextOnFocus) {
      this(text, resetFieldTextOnFocus, -1);
   }
 
   public LabelField(String text, boolean resetFieldTextOnFocus, int width) {
      l = new JLabel(text, SwingConstants.CENTER);
      l.setBorder(DB);
      l.addMouseListener(MA);
      l.setOpaque(true);
      tf = new JTextField(text);
      tf.addMouseListener(MA);
      tf.getDocument().addDocumentListener(DA);
      tf.getInputMap(WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter");
      tf.getActionMap().put("enter", new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
            showLabel();
            l.setBackground(DC);
         }
      });
      if(width > 0) {
         l.setMinimumSize(new Dimension(width, l.getHeight()));
         tf.setMinimumSize(new Dimension(width, l.getHeight()));
      }
      labelIsShowing = true;
      this.resetFieldTextOnFocus = resetFieldTextOnFocus;
      setLayout(new GridBagLayout());
      add(l, C);
   }
 
   public LabelField setText(String text) {
      l.setText(text);
      tf.setText(text);
      return this;
   }
 
   public String getText() {
      return l.getText();
   }
 
   public LabelField setResetFieldTextOnFocus(boolean reset) {
      resetFieldTextOnFocus = reset;
      return this;
   }
 
   public boolean isResettingFieldTextOnFocus() {
      return resetFieldTextOnFocus;
   }
 
   public LabelField showLabel() {
      if(!labelIsShowing) {
         remove(tf);
         add(l, C);
         labelIsShowing = true;
         revalidate();
         repaint();
      }
      return this;
   }
 
   public LabelField showTextField() {
      if(labelIsShowing) {
         remove(l);
         add(tf, C);
         labelIsShowing = false;
         revalidate();
         repaint();
      }
      return this;
   }
}

Test class (LabelFieldTest.java)
package gui;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
 
/**
 *
 * @author Tommy
 */
public class LabelFieldTest extends JFrame {
   public static void main(String[] cake) {
      new LabelFieldTest();
   }
 
   public LabelFieldTest() {
      super();
      setSize(400, 400);
      setResizable(false);
      setLayout(new GridBagLayout());
      GridBagConstraints c = new GridBagConstraints();
      c.gridx = 1;
      c.gridy = 1;
      c.ipadx = 10;
      c.ipady = 10;
      add(new LabelField("Well...", 200), c);
      /*c.gridy = 2;
      add(new LabelButton("Tests!"), c);*/
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setVisible(true);
   }
}

If anyone would be willing, could he/she check out the LabelField and its test class and offer suggestions for improvement (either on my coding or on the idea)?