2014-09-13 6 views
1

Я работаю над Java-приложением, которое имеет 5 окон gui, один из них - приветствие или главное окно, я закончил работу над всеми логическими частями, и я 99.99% что единственное, что осталось, это то, как я могу таким образом кодировать, что, когда я нажимаю на кнопку, скажем, кнопку в главном окне, и это приведет меня ко второму окну, и главное окно будет автоматически закрыто, как могу ли я это сделать?Переход от одного окна GUI к другому GUI

Любая помощь будет оценена по достоинству.


Редактировать

здесь код сэр

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

class Nc extends JFrame 
{ 
private JLabel label; 
private JLabel label1; 
private JLabel label2; 
private JLabel label3; 
private JLabel label4; 
private JButton b; 
private JButton o; 
private JButton h; 
private JButton d; 

private Bn ob; 
private Hd oh; 
private Oc oo; 
private Dc od; 

public Nc() 
{ 
    setTitle("Number Converter"); 
    setSize(200 , 300); 
    setResizable(false); 
    setLocation(500 , 200); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new FlowLayout(FlowLayout.CENTER, 25, 10)); 

    label = new JLabel("Number Converter"); 
    label1 = new JLabel("Java Application"); 
    label2 = new JLabel("Programmed by: Hassan Zia"); 
    label3 = new JLabel("Copyright 2014"); 
    label4 = new JLabel("Click a button"); 

    b = new JButton("Binary"); 
    o = new JButton("Octal"); 
    h = new JButton("Hexa Decimal"); 
    d = new JButton("Decimal"); 

    add(label); 
    add(label1); 
    add(label2); 
    add(label3); 
    add(label4); 

    add(b); // Binary Button 
    add(o); // Octal Button 
    add(h); // Hexa Decimal Button 
    add(d); // Decimal Button 

    b.addActionListener(new action()); 
    o.addActionListener(new action()); 
    h.addActionListener(new action()); 
    d.addActionListener(new action()); 

    setVisible(true); 
} 

void bnc() 
{ 
    ob = new Bn(); 
} 

void hdc() 
{ 
    oh = new Hd(); 
} 

void occ() 
{ 
    oo = new Oc(); 
} 

void dcc() 
{ 
    od = new Dc(); 
} 

private class action implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     if (e.getSource() == b) 
     { 
      bnc(); 
     } 
     if (e.getSource() == h) 
     { 
      hdc(); 
     } 
     if (e.getSource() == o) 
     { 
      occ(); 
     } 
     if (e.getSource() == d) 
     { 
      dcc(); 
     } 
    } 
} 

public static void main (String args[]) 
{ 
    Nc obj = new Nc(); 
} 

This is a picture of the app

+0

Я предполагаю, что это приложение Swing? Вы никогда не говорите, и используемая библиотека графического интерфейса очень важна, так как изменение в ней сильно изменит ответ. Просьба представить более подробную информацию о вашей проблеме, показать соответствующий код и добавить соответствующие теги к вашему вопросу, чтобы помочь нам лучше понять вашу проблему и привлечь к этому вопросу подходящих экспертов. –

+1

Также спросите себя, сколько профессиональных приложений вы используете для перехода от окна к окну? Не так много, потому что это очень отвлекающий и часто неприятный опыт для пользователя. Большинство используют одно основное окно приложения, которое свопирует представления gui в это окно и при случайном диалоговом окне появляется, когда информация необходима модальным способом. Возможно, вам стоит подумать над эмуляцией этого дизайна. Пожалуйста, посмотрите [Использование нескольких JFrames, Хорошая/Плохая Практика?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) –

+0

сэр на самом деле Я работаю над приложением с числовым преобразователем, которое скрывает числа от двоичных до (OCT, DC, HD) и аналогично от других форматов до других форматов (надеюсь, вы получите то, что я имею в виду), У меня есть главное окно с 4 кнопками (Двоичное преобразование, октальное преобразование, e.tc), и когда я нажимаю на кнопку, скажем, Binary Conversion откроет новое окно с именем Binary conversion, но главное окно все еще существует, и я хочу, чтобы он закрывался, когда я нажимаю кнопка . thats all, –

ответ

4

Если это приложение Свинг (вы еще не сказали нам), то вы может решить ваш прямой вопрос, поставив в код ActionListener JButton, что ca lls setVisible(false) в текущем окне, если вы будете использовать его снова или dispose() на нем, если вы его больше не будете использовать, а затем вызывает setVisible(true) на следующем объекте окна, который вы хотите отобразить. Это может быть так же просто:

myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     ThisGuiClass.this.setVisible(false); 
     newGUI.setVisible(true); 
    } 
}); 

, но еще остались без ответа вопросы.

  • Опять же, это графический интерфейс Swing? Конкретные решения будут зависеть от используемой библиотеки GUI.
  • Особенности решения кода также будут полностью зависеть от конкретной структуры кода и программы, которые вы используете, чего вы нам не показали. Пожалуйста, показать нам код, если вам нужен лучший ответ.
  • Опять же, я согласен с моей рекомендацией минимизировать окна, которые бросаются на пользователя, чтобы использовать использование CardLayout для обмена мнениями по одному окну, если это возможно, и ограничить использование 2-го окна модальными JDialogs (как много насколько это возможно). Большая ссылка на это остается ссылка, The Use of Multiple JFrames, Good/Bad Practice?

Редактировать
ОК, я видел, что вы добавили свинг и AWT тег, спасибо, но я до сих пор считаю, что мой ответ пока еще очень неполна, поскольку вопрос все еще не завершен.


Edit 2

на основе кода, я бы стоять на своих первоначальных рекомендаций и будет использовать CardLayout поменять "мнения" JPanel. Например, запустить это:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class NumberConverterWithCardLayout extends JPanel { 
    private CardLayout cardlayout = new CardLayout(); 
    private JPanel cardPanel = new JPanel(cardlayout); 
    private BinaryPanel binaryPanel = new BinaryPanel(); 
    private OctalPanel octalPanel = new OctalPanel(); 
    private HexadecimalPanel hexadecimalPanel = new HexadecimalPanel(); 
    private DecimalPanel decimalPanel = new DecimalPanel(); 
    private JPanel[] allPanels = { binaryPanel, octalPanel, hexadecimalPanel, 
     decimalPanel }; 

    public NumberConverterWithCardLayout() { 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 

     setLayout(new BorderLayout()); 
     add(cardPanel, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.PAGE_END); 

     cardPanel.add(createIntroPanel(), "intro"); 

     for (final JPanel jPanel : allPanels) { 
     cardPanel.add(jPanel, jPanel.getName()); 
     buttonPanel.add(new JButton(new AbstractAction(jPanel.getName()) { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       cardlayout.show(cardPanel, jPanel.getName()); 
      } 
     })); 
     } 
    } 

    private JPanel createIntroPanel() { 
     JPanel introPanel = new JPanel(new GridBagLayout()); 
     introPanel.add(new JLabel("Introductory panel which introduces me and the program")); 
     return introPanel; 
    } 

    private static void createAndShowGui() { 
     NumberConverterWithCardLayout mainPanel = new NumberConverterWithCardLayout(); 

     JFrame frame = new JFrame("Number Converter Application"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

class BinaryPanel extends JPanel { 
    public static final String NAME = "Binary"; 
    private static final int PREF_W = 500; 
    private static final int PREF_H = 400; 

    public BinaryPanel() { 
     setName(NAME); 
     add(new JLabel("A complex GUI that does binary calculations will go here")); 
    } 

    @Override 
    // just to give it some size 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 
} 

class OctalPanel extends JPanel { 
    public static final String NAME = "Octal"; 

    public OctalPanel() { 
     setName(NAME); 
     add(new JLabel("A GUI that does octal calculations will go here")); 
    } 

} 

class HexadecimalPanel extends JPanel { 
    public static final String NAME = "Hexadecimal"; 

    public HexadecimalPanel() { 
     setName(NAME); 
     add(new JLabel("A GUI that does hexadecimal calculations will go here")); 
    } 
} 

class DecimalPanel extends JPanel { 
    public static final String NAME = "Decimal"; 

    public DecimalPanel() { 
     setName(NAME); 
     add(new JLabel("A GUI that does decimal calculations will go here")); 
    } 

} 

Конечно, расчет JPanels будет гораздо сложнее, проведение вложенного JPanels каждый со своим собственным менеджером компоновки, JTextFields, JButtons, и все, что еще будет необходим для реализации их функциональности.


Редактировать 3
На самом деле, думать над этим, даже это слишком много. Вам гораздо лучше использовать один JPanel с двумя текстовыми полями, один для ввода номера и один для отображения результатов, который имеет пучок кнопок внизу. Затем дисплей изменится в зависимости от того, какая кнопка (какой тип преобразования) нажата. Принцип KISS.

+0

спасибо, что сэр !! теперь я попытаюсь использовать JPanels, а затем вложу их в этот код, я не знал о cardLayout раньше, –

+0

@HassanZia: на самом деле вам лучше не использовать CardLayout, а вместо этого посмотрите на Edit 3. –

+0

Я уже сделал некоторые программы, которые используют один JPanle для отображения dfrnt JPanels в нем (вложение нескольких классов в одно окно), но это было только вложение, не свопинг. в любом случае, сэр, я попытаюсь узнать о макете карты и обкатке окон –

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