Вы не показываете никакого кода, и поэтому невозможно понять, почему вы получаете «нулевые» значения.Два возможных решения, если вы хотите, чтобы все три 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;
}
}