2

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

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

我正在使用 NetBeans。

感谢您的帮助!让我知道是否需要任何其他信息。

4

2 回答 2

2

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

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

这将创建一个带有JLabel.
你应该把你的JLabel放在一个专用的JPanel,所以你JLabel从中删除并用它替换它JTextField,然后repaint()/revalidate()

于 2012-07-27T20:36:12.477 回答
1

我创建了一个小例子,我认为它展示了你想要什么。它使用一个按钮,按下该按钮将删除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;
                }
            }
        });
    }
}
于 2012-07-27T20:43:12.073 回答