2013-05-13 3 views
3

это первый раз, когда я посмотрел на JFrames и JPannels, и я немного застрял.Java - замена нескольких JFrames на кнопку

То, что я пытаюсь сделать, это то, что я хочу иметь начальный экран, тогда на основе выбора кнопки пользователя он переходит на другой экран. Для начала у меня есть только 2 экрана, но как только я перейду, будет много экранов. Я посмотрел на CardLayout, и хотя это хорошо, я не хочу, чтобы я хотел это сделать первым. Вот что у меня есть.

Main.java

import java.awt.BorderLayout; 
public class Main extends JFrame { 

private JPanel contentPane; 
protected boolean someCondition = false; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Main frame = new Main(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public Main() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    if(someCondition == false){ 
     showTest(); 
     someCondition = test.needToReg(); 
    }else{ 
     showTest2(); 
    } 
} 

private void showTest(){ 
    contentPane.removeAll(); 
    contentPane.add(new test()); 
    setContentPane(contentPane); 
    revalidate(); 
    repaint(); 
} 

private void showTest2(){ 
    contentPane.removeAll(); 
    contentPane.add(new test2()); 
    setContentPane(contentPane); 
    revalidate(); 
    repaint(); 
} 

}

test.java

import javax.swing.JPanel; 


public class test extends JPanel { 
    private JTextField textField; 
    protected static boolean toReg = false; 

    /** 
    * Create the panel. 
    */ 
    public test() { 
     setLayout(null); 

     JButton btnNewButton = new JButton("New button"); 
     btnNewButton.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println("Mouse Clicked"); 
       System.out.println("Before " + toReg); 
       toReg = true; 
       System.out.println("After " + toReg); 
      } 
     }); 
     btnNewButton.setBounds(188, 166, 89, 23); 
     add(btnNewButton); 

     textField = new JTextField(); 
     textField.setBounds(150, 135, 86, 20); 
     add(textField); 
     textField.setColumns(10); 

     JRadioButton rdbtnNewRadioButton = new JRadioButton("New radio button"); 
     rdbtnNewRadioButton.setBounds(6, 166, 109, 23); 
     add(rdbtnNewRadioButton); 
    } 

    public static boolean needToReg(){ 
     return toReg; 
    } 
} 

test2.java

import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.JLabel; 


public class test2 extends JPanel { 

    /** 
    * Create the panel. 
    */ 
    public test2() { 
     setLayout(null); 

     JButton btnNewButton = new JButton("New button"); 
     btnNewButton.setBounds(56, 59, 89, 23); 
     add(btnNewButton); 

     JLabel lblNewLabel = new JLabel("New label"); 
     lblNewLabel.setBounds(122, 165, 46, 14); 
     add(lblNewLabel); 

    } 
} 

Запуск программы с выходов я включил я получаю это ,

Mouse Clicked 
Before false 
After true 
Mouse Clicked 
Before true 
After true 
Mouse Clicked 
Before true 
After true 
Mouse Clicked 
Before true 
After true 
Mouse Clicked 
Before true 
After true 

Я надеюсь, что это ясно, что я пытаюсь сделать, и надеюсь, что вы сможете протянуть руку с этим. Благодаря

+2

* "Я посмотрел на CardLayout и в то время как это хорошо, что это не так, как я хочу я хочу, чтобы иметь возможность сделать это первым ». * Удачи вам в этом, я думаю, глупо не использовать лучший способ. Я голосую, чтобы закрыть как «слишком локализованный». –

+0

Что случилось с использованием Cardlayout? его цель - разрешить пользователю переключаться между макетами, такими как карты стека. То, как вы сейчас переключаетесь, не является хорошим способом его реализации. Взгляните на учебник еще раз. Он делает именно то, что вы хотите http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html – Aboutblank

+1

@AndrewThompson Что не так с желанием расширить свои знания, взглянув на другие способы делать что-то? Мне кажется глупым ограничивать ваши знания просто так, как способ, которым вы учитесь, не самый лучший способ. Способ, который я чувствую, улучшить, это попробовать, посмотреть, что произойдет. Просто делать лучший способ не сделает вас лучше. Просто мое мнение. – Kyle93

ответ

1

Попробовать это

При нажатии на кнопку screenSwapper в основной раме новая панель добавляется к основной раме, которая может иметь несколько компонентов, я добавил одну кнопку только

На второй клик эта панель удаляется, а вторая панель добавляется к основному фрейму, а предыдущая - удаляется.

подкачка осуществляется, как вы нажмете на кнопку непрерывно

Вы можете использовать два одиночка, если вы хотите сохранить однажды созданную панель в случае MyPanel1 и MyPanel2

Вы можете добавить несколько компонентов на каждом панель и тест.

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test extends JFrame { 

    public boolean switcher; 
    public JPanel currentPanel; 
    public JPanel panel1; 
    public JPanel panel2; 

    public Test() { 

     this.switcher = false; 
     this.currentPanel = null; 
     this.setSize(200, 200); 

     panel1 = new JPanel(); 

     JButton screenSwapper = new JButton("Screen Swapper"); 

     panel1.add(screenSwapper); 

     panel2 = new JPanel(); 

     this.getContentPane().setLayout(new GridLayout(2, 2)); 
     this.getContentPane().add(panel1); 
     this.getContentPane().add(panel2); 

     this.setVisible(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     screenSwapper.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 

       if (switcher == false) { 
        currentPanel = new MyPanel1(); 
        switcher = true; 

        if (panel2.getComponentCount() != 0) { 
         panel2.removeAll(); 
        } 

       } else { 

        switcher = false; 
        currentPanel = new MyPanel2(); 

        if (panel2.getComponentCount() != 0) { 
         panel2.removeAll(); 
        } 

       } 

       panel2.add(currentPanel); 
       panel2.repaint(); 
       panel2.revalidate(); 
      } 

     }); 

    } 

    public static void main(String[] args) { 
     Test t = new Test(); 
    } 

} 

Это первая панель

import java.awt.BorderLayout; 
import java.awt.Button; 

import javax.swing.JPanel; 


public class MyPanel1 extends JPanel{ 



    public MyPanel1() { 
     // TODO Auto-generated constructor stub 

     this.setLayout(new BorderLayout()); 

     this.add(new Button("Button1")); 

    } 




} 

Это вторая панель

import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JPanel; 


public class MyPanel2 extends JPanel { 



    public MyPanel2() { 
     this.setLayout(new BorderLayout()); 

     this.add(new JButton("button2")); 
    } 
} 
+0

Это может сработать, но revalidate() следует выполнить перед repaint(). Кроме того, как насчет требования к нескольким панелям? В любое время, когда вы видите код с использованием операторов if/else или жестко заданных имен панелей, вы знаете, что код не будет легко модифицироваться по мере увеличения количества панелей. У CardLayout уже есть API для управления этим. Нет необходимости пытаться изобретать велосипед. – camickr

+0

@camickr да Я полностью согласен с вами. Небольшая ошибка в revalidate извините за это, но пользователь не устраивает карту layoyut, так что это альтернативное решение, которое я мог бы сделать быстро. –

+0

@camickr. Я не использовал никаких шаблонов проектирования здесь, так что мы можем с уверенностью предотвратить много изменений. Я могу опубликовать хорошее решение, включая лучшие методы разработки программного обеспечения, но я подумал о том, чтобы облегчить процесс мысли и позволить пользователю использовать правильные шаблоны и сделать из него идеальное решение :). надеюсь, вы согласитесь на это. Мы не верим в кормление ложкой. Мне всегда говорили о стековом потоке :) –

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