2016-12-05 3 views
-2

У меня есть 2 JFrame s f1 и f2 оба с кнопками b1 и b2 соответственно.Как закрыть предыдущие JFrames при открытии нового?

Кнопки b1 и b2 переключателя кадров, то есть, если b1 щелкают открывает f2 и если b2 нажатии открывает f1.

Я хочу, чтобы моя программа, чтобы закрыть предыдущий JFrame при попытке открыть новый JFrame, то есть, если b1 щелкают он должен закрыть/скрыть f1 и открыть f2 и наоборот.

Я пробовал setVisible(false), но он не работает.

Буду признателен за любую помощь или предложения.

Вот мой код:

import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class m extends JFrame implements ActionListener 
{ 
    static JFrame f1,f2; 
    static JButton b1,b2; 

    public m() 
    { 
     f1(); 
    } 

    public void f1() 
    { 
     JFrame f1=new JFrame("frame 1"); 
     JButton b1=new JButton("frame 2"); 

     JLabel l1=new JLabel("FRAME 1"); 

     f1.setSize(600,600); 
     b1.setBounds(300,300,100,100); 
     l1.setBounds(300,150,100,100); 
     b1.addActionListener(this); 
     f1.add(b1); 
     f1.add(l1); 
     f1.setVisible(true); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 

    public void f2() 
    { 
     JFrame f2=new JFrame("frame 2"); 
     JButton b2=new JButton("frame 1"); 
     JLabel l2=new JLabel("FRAME 2"); 
     f2.setSize(600,600); 
     b2.setBounds(300,300,100,100); 
     l2.setBounds(300,150,100,100); 
     b2.addActionListener(this); 
     f2.add(b2); 
     f2.add(l2); 
     f2.setVisible(true); 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 

    public static void main(String args[]) 
    { 
     new m(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     String bt=String.valueOf(e.getActionCommand()); 
     if(bt=="frame 2") 
     { 
      f1.setVisible(false); 
      f2(); 
     } 
     else if(bt=="frame 1") 
     { 
      f2.setVisible(false); 
      f1(); 
     } 
    } 
} 
+1

Возможный дубликат [Как сравнить строки в Java?] (Http://stackoverflow.com/questions/513832/how-do-compare-strings-in-java) – Frakcool

+0

@Mdlc, когда вы одобряете предложенные изменения, убедитесь, что нет ничего еще лучше, при редактировании Дорона все еще нужно было улучшить такие вещи, как формат кода! – Frakcool

+0

@DoronYakovlevGolani, пожалуйста, исправьте также формат кода, когда вы предлагаете редактировать все, что вы можете в одном редактировании :) – Frakcool

ответ

4

Есть несколько ошибок в коде:

  1. отступов, вы должны отступа это правильно, так что легче читать

  2. You» re, привязывая к компонентам, вместо этого используйте правильный Layout manager, см.: Null layout is evil и Why is it frowned upon to use null layout in swing?, используя нулевой макет и настройку связанный может показаться лучшим и самым простым способом создания сложных графических интерфейсов, это не так, вы столкнетесь с проблемами в будущем из-за этого, потому что Swing должен работать в разных размерах экрана, разрешениях и PLAF.

  3. Вы расширяете JFrame и создаете объект JFrame, и вы смешиваете их, оставьте один из них. Я предлагаю последнее, потому что в противном случае, когда вы расширяетесь, вы говорите, что ваш класс - этоJFrame, если вам нужно что-то продлить, вместо этого перейдите от JPanel.

  4. Не используйте несколько JFrame с, см: The use of multiple JFrames, good/bad practice? (БАД), вы можете попробовать использовать JDialogs или Card Layout

  5. Вы сравнивая String с с ==, а не с .equals()! См.: How do I compare Strings in Java?

  6. У вас есть статические элементы, которые вы никогда не используете, и JFrame и JButton не должны быть статическими на самом деле!

  7. Эта линия: setDefaultCloseOperation(DISPOSE_ON_CLOSE); и это один setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); не работают на f2 и f1 кадров, но на раме, которая генерируется вашим extends

  8. Вы не размещая вашу программу на EDT

В простой программе у вас есть все эти ошибки!Поэтому я предлагаю вам вернуться к основам Java, прежде чем идти с графическими интерфейсами, которые делают программы более сложными и сложными для изучения основ.

Теперь сказавший вышеуказанные ошибки, если вы настаиваете в наличии 2 JFrame S:

//Create both frames 

JFrame frame1 = new JFrame("Frame1"); 
JFrame frame2 = new JFrame("Frame2"); 

//Add your buttons using a proper layout manager as suggested above 
... 
//Later in your code in your actionPerformed: 
if (e.getSource.equals(b1)) { 
    //To close the frame w/o exiting application 
    frame1.dispose(); 
    frame2 = new JFrame("Frame2"); //Or call the method that creates this JFrame 

    //To toggle frame visibility and not closing it 
    frame1.setVisible(false); 
    frame2.setVisible(true); 
} else if (e.getSource.equals(b2)) { 
    //To close the frame w/o exiting application 
    frame2.dispose(); 
    frame1 = new JFrame("Frame2"); //Or call the method that creates this JFrame 

    //To toggle frame visibility and not closing it 
    frame2.setVisible(false); 
    frame1.setVisible(true); 
} 

Это главная идея, для справки, проверить this answer и ссылки и повторяющиеся вопросы там слишком

+0

добавление макета к кадру решило мою проблему. Спасибо за вашу помощь –

+0

@Gk, тогда не забудьте принять ответ, если это помогло вам ^^ – Frakcool