【问题标题】:Converting jLabel to a jTextField将 jLabel 转换为 jTextField
【发布时间】:2012-07-27 20:23:47
【问题描述】:

我正在开发一个JFrame 接口,以便与大量数据轻松交互。数据保存在 .txt 文件中,当从JList 中选择名称时,我的程序会读取相应的数据行,将它们转换为我定义的对象(CounterParty) ,并在JLabels 中显示对象的相应字段。这一切都很好。我还编写了代码来启动一个新的JPanel 来编辑选定的对象。 JPanel 打开,已填充数据,当单击按钮时,.txt 文件中的现有信息将被删除并替换为新的编辑数据。这也很有效。

不过,我想让它更对用户友好。我希望最初显示信息的JLabels 在单击Edit 按钮时转换为填充有来自jLabels 的数据的JTextFields。这将消除完全启动新 JPanel 窗口的需要。我认为这会将 JLabels 的可见性更改为 false 并创建新的 JTextField 对象。我遇到了这个问题。
JLabel 对象可以转换为JTextFields 吗?我是否可以将两个对象都放在完全相同的位置,但能见度不同?我不知道该怎么做。

我正在使用 NetBeans。

感谢您的帮助!如果需要任何其他信息,请告诉我。

【问题讨论】:

    标签: netbeans visibility jlabel jtextfield


    【解决方案1】:

    这是一种方法:
    假设JLabel 是你的labeltextfield 你的JTextField

     textfield = new JTextField(label.getText());
    

    这将使用JLabel 的文本创建一个。
    您应该将您的JLabel 放在专用的JPanel 中,因此您从其中删除JLabel 并将其替换为JTextField,然后是repaint()/revalidate()

    【讨论】:

      【解决方案2】:

      我创建了一个小示例,我认为它可以展示您想要的内容。它使用一个按钮,按下该按钮将删除JTextField 并添加JLabel,反之亦然,然后它将调用revalidate()repaint() 以在每次按钮单击后显示对框架的更改:

      import java.awt.BorderLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import javax.swing.*;
      
      public class JLabelToJTextField extends JFrame {
      
          JLabel jLabel;
          JTextField jTextField;
          JButton jButton;
          JPanel mainPanel;
      
          public JLabelToJTextField() {
              jLabel = new JLabel("Name");
              jTextField = new JTextField(15);
              jButton = new JButton("Edit");
              mainPanel = new JPanel(new BorderLayout());
      
              createUI();
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      new JLabelToJTextField().setVisible(true);
                  }
              });
          }
      
          private void createUI() {
              setTitle("JLabel to JtextField");
              setResizable(false);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              addComponentsToPanel();
              setLocationRelativeTo(null);
              pack();
      
          }
      
          private void addComponentsToPanel() {
              mainPanel.add(jLabel, BorderLayout.CENTER);
              mainPanel.add(jButton, BorderLayout.SOUTH);
              addActionListeners();
              getContentPane().add(mainPanel);
          }
      
          private void addActionListeners() {
              jButton.addActionListener(new ActionListener() {
      
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      switch (jButton.getText()) {
                          case "Edit":
                              mainPanel.remove(jLabel);//remove component
                              mainPanel.add(jTextField, BorderLayout.CENTER);//add new component
                              jButton.setText("Done");
                              //refresh JFrame
                              revalidate();
                              repaint();
      
                              break;
                          case "Done":
                              mainPanel.remove(jTextField);//remove component
                              mainPanel.add(jLabel, BorderLayout.CENTER);//add new component
                              jButton.setText("Edit");//set button text to original
                              //refresh JFrame
                              revalidate();
                              repaint();
                              break;
                      }
                  }
              });
          }
      }
      

      【讨论】:

      • 我刚刚添加了“jTextField.setText(jLabel.getText());”和适当的开关的反相,我得到了我正在寻找的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2015-08-30
      • 2012-06-19
      • 2014-03-17
      • 2016-05-17
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多