如何将数据从一个 JPanel 传递到另一个...?

Suj*_*jay 4 java swing jpanel jframe

我有一个JFrame包含 3 的JPanels。我想将JTextField一个面板的值传递给另一个面板。每个面板都使用 显示JTabbedPane。当我访问其他文本字段的值时,我得到了空值。我如何访问?

Hov*_*els 5

您没有显示任何代码,因此不可能知道为什么会得到“空”值。如果您希望所有三个 JPanel 都保存具有相同内容的 JTextField,则有两种可能的解决方案:

  • 将共享的 JTextField 放在 JTabbedPane 保存的 JPanel 之外,而是放在保存 JTabbedPane 的 JPanel 中,这样无论显示什么选项卡,该字段始终可见,或者
  • 使用多个 JTextField,但让它们共享相同的 Document 或“模型”。

例如,

import java.awt.Dimension;
import javax.swing.*;
import javax.swing.text.PlainDocument;

public class SharedField extends JTabbedPane {
   private static final int TAB_COUNT = 5;
   private static final int MY_WIDTH = 600;
   private static final int MY_HEIGHT = 300;
   PlainDocument doc = new PlainDocument();

   public SharedField() {
      for (int i = 0; i < TAB_COUNT; i++) {
         JTextField tField = new JTextField(10);
         tField.setDocument(doc);
         JPanel panel = new JPanel();
         panel.add(tField);
         add("Panel " + i, panel);

         // to demonstrate some of the JTextFields acting like 
         // a label
         if (i % 2 == 1) { // if i is odd
            tField.setEditable(false);
            tField.setBorder(null);
         }
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(MY_WIDTH, MY_HEIGHT);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("SharedField");
      frame.getContentPane().add(new SharedField());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑 1
我看到你在java-forums.org/上交叉发布了这个,你展示了你的一些代码:

包演示工具;Class:MainFrame 这是第一个面板的 actionPerformed 代码 str 和 scrTxt 是(公共静态)

   public void actionPerformed(ActionEvent e)
    {
        String act=e.getActionCommand();

        if(act.equals("ADD"))
        {
            str=scrnTxt.getText();
            System.out.println("Hi :"+str);
            Demotool.DemoTool.jtp.setSelectedIndex(1);   
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用 belove 代码我试图访问数据,但我得到了空字符串:

 System.out.println("Hello:"+Demotool.MainFrame.str);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 除非有充分的理由,否则不要使用静态变量或方法。在这里你没有。
  • 您可能正在尝试在将任何内容放入 MainFrame.str 变量之前访问它,使其为空,或者您正在第二个类中创建一个新的 MainFrame 对象,该对象未显示,因此其 str变量为空或为空——很难说。

无论哪种方式,这种设计都不好。您最好向我们展示一个小型演示程序,该程序显示您在编译和运行的代码方面的问题,一个sscce,以便我们可以使用和修改您的代码,并更好地向您展示一个体面的解决方案。

一个这样体面的解决方案是向DocumentListenerthe添加一个,JTextField以便对 持有的文本的更改JTextField“推送”到正在监听更改的观察者(您的其他类)。

例如,使用 DocumentListeners:

import java.awt.Dimension;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

public class SharedField2 extends JTabbedPane {
   private static final int LABEL_PANEL_COUNT = 4;
   private static final int MY_WIDTH = 600;
   private static final int MY_HEIGHT = 300;

   public SharedField2() {
      TextFieldPanel tfPanel = new TextFieldPanel();
      LabelPanel[] labelPanels = new LabelPanel[LABEL_PANEL_COUNT];

      add("TextFieldPanel", tfPanel);
      for (int i = 0; i < labelPanels.length; i++) {
         labelPanels[i] = new LabelPanel();
         // add each label panel's listener to the text field
         tfPanel.addDocumentListenerToField(labelPanels[i].getDocumentListener());
         add("Label Panel " + i, labelPanels[i]);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(MY_WIDTH, MY_HEIGHT);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("SharedField2");
      frame.getContentPane().add(new SharedField2());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class TextFieldPanel extends JPanel {
   private JTextField tField = new JTextField(10);

   public TextFieldPanel() {
      add(tField);
   }

   public void addDocumentListenerToField(DocumentListener listener) {
      tField.getDocument().addDocumentListener(listener);
   }
}

class LabelPanel extends JPanel {
   private DocumentListener myListener;

   private JLabel label = new JLabel();

   public LabelPanel() {
      add(label);
      myListener = new DocumentListener() {

         @Override
         public void changedUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         @Override
         public void insertUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         @Override
         public void removeUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         private void updateLabel(DocumentEvent e) {
            try {
               label.setText(e.getDocument().getText(0,
                        e.getDocument().getLength()));
            } catch (BadLocationException e1) {
               e1.printStackTrace();
            }
         }

      };
   }

   public DocumentListener getDocumentListener() {
      return myListener;
   }
}
Run Code Online (Sandbox Code Playgroud)