JPanel с JTextField или JLabel не обновляется - PullRequest
4 голосов
/ 11 февраля 2012

Я пытался найти ответ, но у меня не получается. Я довольно новичок в Java. У меня есть 4 класса (1 основной с JFrame и 3 JPanels). Основной класс создает JFrame и добавляет к нему 3 панели. Я пытаюсь выполнить обновление JLabel или JTextField на 1 панели (panelA) из ActionEvent на другой панели (panelB). ActionEvent в panelB запускает метод в panelA, который запускает метод setText () и метод repaint (). Я не могу получить JLabel или JTextField для обновления с новым текстом.

Вот мой код:

App.java

public class App {
    public static void main(String[] args) {
        JFrame nameFrame = new JFrame("Name Form");
        nameFrame.setLayout(new BorderLayout());
        nameFrame.setSize(300,150);
        nameFrame.setLocationRelativeTo(null);
        nameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MiddlePanel middlePanel = new MiddlePanel();
        nameFrame.add(middlePanel, BorderLayout.CENTER);
        BottomPanel bottomPanel = new BottomPanel();
        nameFrame.add(bottomPanel, BorderLayout.SOUTH);
        nameFrame.setVisible(true);
    }
}

BottomPanel.java

import java.awt.FlowLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BottomPanel extends JPanel {
    private JLabel welcomeLabel = new JLabel("Old Text");

    BottomPanel() {
        super(new FlowLayout());
        add(welcomeLabel);
    }
    public void setText(String text) {
        welcomeLabel.setText(text);
        repaint();
    }
}

MiddlePanel.java

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.Graphics;

public class MiddlePanel extends JPanel {
    MiddlePanel() {
        super(new BorderLayout());

        JButton okButton = new JButton("OK");
        okButton.setSize(20, 20);
        OKButtonListener okButtonListener = new OKButtonListener();
        okButton.addActionListener(okButtonListener);

        add(okButton, BorderLayout.EAST);
    }
    class OKButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            BottomPanel bottomPanel = new BottomPanel();
            bottomPanel.setText("New Text");
        }
    }
}

Спасибо за любую помощь.

Ответы [ 2 ]

7 голосов
/ 11 февраля 2012

В вашем OKButtonListener вы создаете новый экземпляр BottomPanel, который не имеет ничего общего с BottomPanel, который вы добавили в свой JFrame. Вам понадобится фактическая ссылка на BottomPanel, которую вы добавили в свой JFrame.

4 голосов
/ 11 февраля 2012

d1rk прибил его. Вот один из способов достижения этого эффекта.

End Result

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;

public class App {
    public static void main(String[] args) {
        JFrame nameFrame = new JFrame("Name Form");
        nameFrame.setLayout(new BorderLayout());
        nameFrame.setSize(300,150);
        nameFrame.setLocationRelativeTo(null);
        nameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BottomPanel bottomPanel = new BottomPanel();

        MiddlePanel middlePanel = new MiddlePanel(bottomPanel);
        nameFrame.add(middlePanel, BorderLayout.CENTER);
        nameFrame.add(bottomPanel, BorderLayout.SOUTH);
        nameFrame.setVisible(true);
    }
}

class BottomPanel extends JPanel {
    private JLabel welcomeLabel = new JLabel("Old Text");

    BottomPanel() {
        super(new FlowLayout());
        add(welcomeLabel);
    }
    public void setText(String text) {
        welcomeLabel.setText(text);
        repaint();
    }
}

class MiddlePanel extends JPanel {

    private BottomPanel bottomPanel;

    MiddlePanel(BottomPanel bottomPanel) {
        super(new BorderLayout());

        this.bottomPanel = bottomPanel;

        JButton okButton = new JButton("OK");
        okButton.setSize(20, 20);
        OKButtonListener okButtonListener = new OKButtonListener();
        okButton.addActionListener(okButtonListener);

        add(okButton, BorderLayout.EAST);
    }
    class OKButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //BottomPanel bottomPanel = new BottomPanel();
            bottomPanel.setText("New Text");
        }
    }
}
...