2016-03-23 3 views
0

Я пытаюсь открыть DebtForm.java, когда нажата кнопка btnAddNewDebt от IOUApplication.java. После нажатия кнопки окно должно быть закрыто и должно открыться окно DebtForm.java.Открытие JFrame при нажатии JButton

Мне удалось открыть DebtForm.java, когда нажата кнопка btnAddNewDebt, но я не могу закрыть окно IOUApplication.java.

Я попытался с помощью следующих действий:

public void close(){ 
    WindowEvent winClosingEvent = new WindowEvent(this,WindowEvent.WINDOW_CLOS­ING); 
    Toolkit.getDefaultToolkit().getSystemEve­ntQueue().postEvent(winClosingEvent); 
} 

Но я не уверен, куда поместить код, или если есть какие-либо другие альтернативные методы, чтобы закрыть окно.

Вот отрывок из IOUApplication.java для контекста:

public void initialize() { 

    frame = new JFrame(); 
    frame.getContentPane().setBackground(Color.DARK_GRAY); 
    frame.setBounds(100, 100, 450, 132); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JButton btnAddNewDebt = new JButton("Add new debt"); 
    btnAddNewDebt.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 
      DebtForm frame = new DebtForm(); 
      frame.setVisible(true); 
     } 
    }); 

    btnAddNewDebt.setBounds(81, 18, 117, 29); 
    frame.getContentPane().add(btnAddNewDebt);  

    JButton btnPersonalDebt = new JButton("Personal Debt"); 
    btnPersonalDebt.setBounds(266, 18, 117, 29); 
    frame.getContentPane().add(btnPersonalDebt); 

    JLabel lblWrittenAndCoded = new JLabel("Written and coded by Samuel Kahessay"); 
    lblWrittenAndCoded.setForeground(Color.WHITE); 
    lblWrittenAndCoded.setBounds(108, 88, 252, 16); 
    frame.getContentPane().add(lblWrittenAndCoded); 
} 
+0

1) См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/q/9554636/418556) 2) Java GUI должны работать с различными ОС, размером экрана, экраном разрешение и т. д., используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). 3) Чтобы получить более эффективную помощь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Что случилось с ['Window # dispose'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#dispose()) или [' Window # setVisible'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#setVisible(boolean))? Возможно, взгляните на [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) и для альтернатива взгляните на [Как использовать CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer

+0

Избегайте использования макетов «null», идеальные макеты пикселей - это иллюзия в современных ui дизайн. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбрасывая их, что не приведет к проблемам и проблемам, которые вы потратите все больше времени на исправление. – MadProgrammer

ответ

0

Для того, чтобы закрыть JFrame, все, что вам нужно сделать, это вызов frame.dispose(). Этот метод полностью избавится от JFrame в памяти. Если вы хотите позже открыть окно, все, что вам нужно сделать, это frame.setVisible (false), а затем frame.setVisible (true), когда вы хотите его снова открыть. Возможно, вам придется сделать JFrame глобальной переменной, чтобы сделать это. Если предположить, что код, который вы написали для DebtForm() работает, чтобы создать свой собственный JFrame, вот как это выглядит:

public void initialize() { 

/* Your same code */ 
frame = new JFrame(); 
frame.getContentPane().setBackground(Color.DARK_GRAY); 
frame.setBounds(100, 100, 450, 132); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().setLayout(null); 

JButton btnAddNewDebt = new JButton("Add new debt"); 
btnAddNewDebt.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     DebtForm debtForm = new DebtForm(); 
     debtForm.setVisible(true); 
     /* THE ONLY NEW LINE OF CODE */ 
     frame.setVisible(false); //This will make the first window disapear. 
     /* ------------------------- */ 
    } 
}); 

btnAddNewDebt.setBounds(81, 18, 117, 29); 
frame.getContentPane().add(btnAddNewDebt);  

JButton btnPersonalDebt = new JButton("Personal Debt"); 
btnPersonalDebt.setBounds(266, 18, 117, 29); 
frame.getContentPane().add(btnPersonalDebt); 

JLabel lblWrittenAndCoded = new JLabel("Written and coded by Samuel Kahessay"); 
lblWrittenAndCoded.setForeground(Color.WHITE); 
lblWrittenAndCoded.setBounds(108, 88, 252, 16); 
frame.getContentPane().add(lblWrittenAndCoded); 
} 

Позже, для того, чтобы сделать оригинальный снова отобразить окно, за пределами вашего Initialize() метод вы нужно будет объявить «кадр», как это:

public static JFrame frame = new JFrame(); 

Теперь в вашем DebtForm.java, вы можете сделать рамку видимой снова, как это:

IOUApplication.frame.setVisible(true); 

Я надеюсь, что это помогает. Спасибо за чтение!

+0

Спасибо! Это именно то, что я искал. –

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