Estoy intentando abrir un nuevo JFrame ventana con un evento de clic de botón. Hay mucha información en este sitio, pero nada que me ayuda, porque creo que no es tanto el código que tengo, pero el orden en que se ejecuta (sin embargo no estoy seguro).

Este es el código para el marco que sostiene el botón que quiero iniciar el evento:

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); 
} 

Si no quieren profundizar en el código anterior, el botón ActionListener está aquí:

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

Este es el código en la clase de la celebración de la JFrame quiero abrir:

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);
}
}

Podría por favor alguien que me señale en la dirección correcta?

  • No sé por qué se establece el viewCourseGUI a ser igual a un nuevo JFrame. Hacer esto: JFrame ViewCourseGUI = new ViewCourseGUI();
  • Voy a darle una oportunidad. No estoy seguro de que cualquiera, aún el aprendizaje de estos pequeños matices.
  • public void ViewCoursesGUI() es no un constructor y no será llamado cuando se utiliza new palabra clave. Quitar void. Los constructores no pueden tener cualquier declarado tipo de retorno, incluso void.
  • Combine esto con el hecho de que yo he llamado ViewCoursesGUI() en lugar de ViewCourseGUI (…) Y ahora funciona. Muchas gracias.
  • Consulte El Uso de Múltiples JFrames, la Buena/Mala Práctica?
InformationsquelleAutor Splunk | 2014-06-06

3 Comentarios

  1. 1

    Establecer la visibilidad de la JFrame que desea abrir y, a la verdad en el actionListener:

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

    Se abrirá el nuevo JFrame ventana una vez que haga clic en el botón.

    • No es una mala idea!
  2. 0

    Vamos a ReportGUI implementar ActionListener. Entonces usted va a implementar actionPerformed del botón haga clic en. En el botón de clic, crear el segundo fotograma (si no existe). Por último, establece el segundo marco visible (si no está visible):

    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);
    }
    }
    }

    Este es un simple ejemplo. Usted tendrá que añadir el resto de tu código aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here