Я создал свой графический интерфейс в классе ClientGUI.java и попытался создать экземпляр в другом классе («Client.java»). GUI просто состоит из двух кнопок («Вперед» и «Назад»), из которых только одна кнопка присутствует одновременно. Сначала графический интерфейс работает нормально, поскольку кадр отображается одной кнопкой. Однако, как только кнопка нажата, она просто исчезает и не заменяется второй. Установив контрольные точки, я обнаружил, что вызывается правильная функция ActionListener и удаляется первая кнопка, но не добавляется вторая.Запуск GUI из другого класса
Графический интерфейс класса "ClientGUI.java":
package GUI;
import javax.swing.JPanel;
import java.awt.Dimension;
import javax.swing.JButton;
import java.net.MalformedURLException;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ClientGUI extends JPanel implements ActionListener {
private static JButton btnForward = new JButton("Forward"),
btnBackward = new JButton("Backward");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
createAndShowGUI();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public ClientGUI() throws MalformedURLException {
setLayout(new BorderLayout());
add(btnForward, BorderLayout.CENTER);
btnForward.addActionListener(this);
btnBackward.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnForward) {
remove(btnForward);
add(btnBackward, BorderLayout.CENTER);
revalidate();
repaint();
}
else if (e.getSource() == btnBackward) {
remove(btnBackward);
add(btnForward);
revalidate();
repaint();
}
}
private static void createAndShowGUI() throws MalformedURLException {
JFrame frame = new JFrame("ClientGUI");
frame.setMinimumSize(new Dimension(500, 400));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ClientGUI());
frame.setSize(500, 400);
frame.setVisible(true);
}
}
И класс "Clients.java", из которого я хочу использовать графический интерфейс:
import java.net.*;
import GUI.ClientGUI;
public class Client {
public static void main(String[] args) {
Client client = new Client();
}
Client() {
String[] args = {"ggg", "vvv"};
try {
new ClientGUI().main(args);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Спасибо за вашу помощь.
использование CardLayout ... – mKorbel
Вы не должны называть 'init'. из другого класса. Вы должны вызвать его из конструктора. В вашем случае это может не сработать, поскольку ваш класс в JPanel, который вы добавляете в фрейм в 'init', поэтому, если вы вызываете' init' из конструктора, вы получите бесконечный цикл. См. Мой ответ. Я просто сделал несколько простых исправлений. Но есть еще больше, что вы можете улучшить - с точки зрения хорошей практики. –
@mKorbel Я думал о том же, но OP не пытается использовать два sepearate кадра. Вопрос в том, что это похоже на это, но OP просто пытается запустить класс GUI из другого класса, который загружает графический интерфейс. –