2014-06-06 4 views
2

Я пытаюсь открыть новое окно JFrame с событием нажатия кнопки. На этом сайте много информации, но ничего мне не помогает, потому что я думаю, что это не столько код, который у меня есть, а порядок его исполнения (однако я не уверен).Открыть новый JFrame с помощью JButton Click - Java Swing

Это код фрейма, удерживая кнопку, что я хочу, чтобы инициировать событие:

package messing with swing; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.border.EmptyBorder; 


public class ReportGUI extends JFrame{ 
    //Fields 
    private JButton viewAllReports = new JButton("View All Program Details"); 
    private JButton viewPrograms = new JButton("View Programs and Majors Associated with this course"); 
    private JButton viewTaughtCourses = new JButton("View Courses this Examiner Teaches"); 
    private JLabel courseLabel = new JLabel("Select a Course: "); 
    private JLabel examinerLabel = new JLabel("Select an Examiner: "); 
    private JPanel panel = new JPanel(new GridLayout(6,2,4,4)); 
    private ArrayList<String> list = new ArrayList<String>(); 
    private ArrayList<String> courseList = new ArrayList<String>(); 


    public ReportGUI(){ 
      reportInterface(); 
      allReportsBtn();  
      examinnerFileRead(); 
      courseFileRead(); 
      comboBoxes(); 
    }   

    private void examinnerFileRead(){ 
     try{ 
      Scanner scan = new Scanner(new File("Examiner.txt")); 

      while(scan.hasNextLine()){ 
       list.add(scan.nextLine()); 
      } 
      scan.close(); 
     } 
     catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
    } 
     private void courseFileRead(){ 
     try{ 
      Scanner scan = new Scanner(new File("Course.txt")); 

      while(scan.hasNextLine()){ 
       courseList.add(scan.nextLine()); 
      } 
      scan.close(); 
     } 
     catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void reportInterface(){   
      setTitle("Choose Report Specifications");     
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      JPanel panel = new JPanel(new FlowLayout());   
      add(panel, BorderLayout.CENTER); 
      setSize(650,200); 
      setVisible(true);  
      setResizable(false); 
      setLocationRelativeTo(null); 
}  
    private void allReportsBtn(){ 
     JPanel panel = new JPanel(new GridLayout(1,1)); 
     panel.setBorder(new EmptyBorder(70, 50, 70, 25)); 
     panel.add(viewAllReports);   
     viewAllReports.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       JFrame AllDataGUI = new JFrame(); 
       new AllDataGUI(); 
      } 
     });   
     add(panel, BorderLayout.LINE_END); 
    }  
    private void comboBoxes(){     
     panel.setBorder(new EmptyBorder(0, 5, 5, 10)); 
     String[] comboBox1Array = list.toArray(new String[list.size()]); 
     JComboBox comboBox1 = new JComboBox(comboBox1Array);   
     panel.add(examinerLabel); 
     panel.add(comboBox1);   
     panel.add(viewTaughtCourses); 
     viewTaughtCourses.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) {     
       JFrame ViewCourseGUI = new JFrame(); 
       new ViewCourseGUI(); 
      } 
     }); 
     String[] comboBox2Array = courseList.toArray(new String[courseList.size()]); 
     JComboBox comboBox2 = new JComboBox(comboBox2Array); 
     panel.add(courseLabel);   
     panel.add(comboBox2); 
     panel.add(viewPrograms); 
     add(panel, BorderLayout.LINE_START); 

    } 

Если вы не хотите вникать в коде выше, кнопка ActionListener здесь:

panel.add(viewTaughtCourses); 
      viewTaughtCourses.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) {     
        JFrame ViewCourseGUI = new JFrame(); 
        new ViewCourseGUI(); 
       } 
      }); 

Это код в классе проведения JFrame я хочу открыть:

package messing with swing; 

import java.awt.BorderLayout; 
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; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 


public class ViewCourseGUI extends JFrame{ 
    private JButton saveCloseBtn = new JButton("Save Changes and Close"); 
    private JButton closeButton = new JButton("Exit Without Saving"); 
    private JFrame frame=new JFrame("Courses taught by this examiner"); 
    private JTextArea textArea = new JTextArea(); 



    public void ViewCoursesGUI(){ 
     panels(); 
    }   

    private void panels(){   
      JPanel panel = new JPanel(new GridLayout(1,1)); 
      panel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
      JPanel rightPanel = new JPanel(new GridLayout(15,0,10,10)); 
      rightPanel.setBorder(new EmptyBorder(15, 5, 5, 10)); 
      JScrollPane scrollBarForTextArea=new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
      panel.add(scrollBarForTextArea); 
      frame.add(panel); 
      frame.getContentPane().add(rightPanel,BorderLayout.EAST); 
      rightPanel.add(saveCloseBtn); 
      rightPanel.add(closeButton); 

      frame.setSize(1000, 700); 
      frame.setVisible(true); 
      frame.setLocationRelativeTo(null); 

} 
} 

Может ли кто-нибудь указать мне в правильном направлении?

+1

Я не знаю, почему вы устанавливаете viewCourseGUI равным новому JFrame. Сделайте это: JFrame ViewCourseGUI = новый ViewCourseGUI(); – Sesame

+0

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

+3

'public void ViewCoursesGUI()' is ** не ** конструктор и не будет вызываться при использовании ключевого слова 'new'. Удалите 'void'. Конструкторы не могут иметь ** любой ** объявленный тип возврата, даже 'void'. –

ответ

1

Как отметил PM 77-3

Я имел:

public void ViewCoursesGUI(){ 
    panels(); 
}   

Когда я должен был:

public ViewCourseGUI(){ 
    panels(); 
}   

Сочетание синтаксических и орфографических ошибок.

+3

также проверка [использование нескольких JFrames хорошая или плохая практика] (http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice/9554657#9554657) это действительно интересно. – Frakcool

+0

Вы используете IDE? –

1

Установить видимость JFrame вы хотите открыть, чтобы верно в ActionListener:

ViewCourseGUI viewCourseGUI = new ViewCourseGUI(); 
viewCourseGUI.setVisible(true); 

Откроется новое окно JFrame после нажатия на кнопку.

+0

Неплохая идея! – Bernard

0

Пусть ReportGUI реализует ActionListener. Затем вы будете применять actionPerformed для нажатия кнопки. При нажатии кнопки создайте второй кадр (если он не существует). Наконец, установите видимый второй кадр (если он в настоящее время не виден):

import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class ReportGUI extends JFrame implements ActionListener { 
    private static final long serialVersionUID = 8679886300517958494L; 

    private JButton button; 
    private ViewCourseGUI frame2 = null; 

    public ReportGUI() { 

     //frame1 stuff 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(300,200); 
     setLayout(new FlowLayout()); 

     //create button 
     button = new JButton("Open other frame"); 
     button.addActionListener(this); 
     add(button); 

    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        ReportGUI frame = new ReportGUI(); 
        frame.setVisible(true); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == button) { 
      if (frame2 == null) 
       frame2 = new ViewCourseGUI(); 
      if (!frame2.isVisible()) 
       frame2.setVisible(true); 
     } 

    } 

} 

Это простой пример. Здесь вы должны добавить остальную часть своего кода.

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