Как я могу передать данные из одной JPanel в другую ...? - PullRequest
3 голосов
/ 28 июля 2011

У меня есть JFrame, который содержит 3 JPanels.Я хочу передать значение JTextField одной панели другой.Каждая панель показана с использованием JTabbedPane.Я получаю нулевое значение, когда я получаю доступ к значению другого текстового поля.Как я могу получить доступ?

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

Вы не показываете никакого кода, и поэтому невозможно понять, почему вы получаете «нулевые» значения.Два возможных решения, если вы хотите, чтобы все три JPanel содержали JTextFields с одинаковым содержимым:

  • Поместите общий JTextField за пределы JPanels, хранящихся в JTabbedPane, и вместо этого в JPanel, который содержит JTabbedPane, такполе всегда отображается независимо от того, какая вкладка отображается, или
  • Используйте несколько полей JTextFields, но пусть они совместно используют один и тот же документ или "модель".

например,

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();
         }
      });
   }
}

Редактировать 1
Я вижу, что вы кросс-постили это на java-forums.org / , где вы показываете часть своего кода:

pacage Demotool;Класс: MainFrame Это код actionPerformed первой панели, str и scrTxt (public static)

   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);   
        }
    }

с использованием любимого кода, который я пытался получить доступ к данным, но я получаю нулевое значениеСтрока:

 System.out.println("Hello:"+Demotool.MainFrame.str);

Проблемы:

  • Не используйте статические переменные или методы, если у вас нет веских причин для этого.Здесь вы этого не делаете.
  • Возможно, вы пытаетесь получить доступ к переменной MainFrame.str до того, как в нее будет что-либо вставлено, что делает ее нулевой, или вы создаете новый MainFrameобъект в вашем втором классе, тот, который не отображается, и, следовательно, тот, чья переменная str пустая или нулевая - трудно сказать.

В любом случае, этот дизайн не хорош.Вам лучше показать нам небольшую демонстрационную программу, которая показывает вашу проблему с кодом, который компилируется и запускается, sscce , чтобы мы могли поиграть и изменить ваш код и лучше показать вам достойное решение.

Одним из таких достойных решений является добавление DocumentListener к 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;
   }
}
1 голос
/ 28 июля 2011

Одним простым решением будет сделать глобальный JTextField, чтобы все панели могли получить к нему доступ.

Убедитесь, что вся ваша панель имеет доступ к JTextField, так как textField доступен по всему миру.

Следующий код демонстрирует это:

JTextField textField = new JTextField(25);
JLabel labelForPanel2 = new JLabel(),labelForPanel3 = new JLabel();
private void panelDemo() {
    JFrame frame = new JFrame();
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();

    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Tab 1", panel1);
    tabbedPane.addTab("Tab 2", panel2);
    tabbedPane.addTab("Tab 3", panel3);

    panel1.add(textField);
    panel2.add(labelForPanel2);
    panel3.add(labelForPanel3);

    textField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            labelForPanel2.setText(textField.getText());
            labelForPanel3.setText(textField.getText());
        }
    });

    frame.add(tabbedPane);
    frame.setVisible(true);
}
0 голосов
/ 28 июля 2011

Я не знаю, что именно вы собираетесь достичь, но, возможно, попробуйте связать данные?

Взгляните на библиотеку BetterBeansBinding .

...