2014-01-16 2 views
1

Я создал свой графический интерфейс в классе 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(); 
      } 
    } 
} 

Спасибо за вашу помощь.

+3

использование CardLayout ... – mKorbel

+0

Вы не должны называть 'init'. из другого класса. Вы должны вызвать его из конструктора. В вашем случае это может не сработать, поскольку ваш класс в JPanel, который вы добавляете в фрейм в 'init', поэтому, если вы вызываете' init' из конструктора, вы получите бесконечный цикл. См. Мой ответ. Я просто сделал несколько простых исправлений. Но есть еще больше, что вы можете улучшить - с точки зрения хорошей практики. –

+0

@mKorbel Я думал о том же, но OP не пытается использовать два sepearate кадра. Вопрос в том, что это похоже на это, но OP просто пытается запустить класс GUI из другого класса, который загружает графический интерфейс. –

ответ

4
  1. Никогда не называйте метод main. Метод main предназначен для JVM знать точку входа для программы.
  2. Не используйте два метода main. Какая бы ни была программа точки входа, используйте метод main только в этом
  3. Просто используйте конструктор. Когда первый GUI вызывает второй, все в конструкторе будет построено.

Настоящая обновленная версия. Оно работает.

  • Я избавилась от main от ClientGUI
  • Я назвал ClientGUI.createAndShowGUI() из main в Client классе.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.*; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Client { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Client(); 
      } 
     }); 
    } 

    Client() { 
     String[] args = {"ggg", "vvv"}; 

     try { 
      ClientGUI.createAndShowGUI(); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

class ClientGUI extends JPanel implements ActionListener { 

    private static JButton btnForward = new JButton("Forward"), 
      btnBackward = new JButton("Backward"); 



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

    public 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); 
    } 
} 
+0

спасибо за пояснение и пример кода! Я предполагаю, что SwingUtilities.invokeLater вызывается внутри основного метода класса клиента? – user3202098

+0

Да, я случайно удалил 'main', когда добавил SwingUtilities. ** Исправлено ** –

+0

Еще раз спасибо за ваш быстрый ответ. Все плохие практики в стороне, я считаю, главной проблемой был «новый ClientGUI(). Main (args);». Если вместо этого была «ClientGUI.main (args)»; (или метод CreateAndShow), он уже будет работать. Не могли бы вы объяснить, в чем проблема с созданием объекта ClientGUI? – user3202098

Смежные вопросы