Java 在新类中打开新窗口时,按钮不会出现在我的GUI中

Java 在新类中打开新窗口时,按钮不会出现在我的GUI中,java,eclipse,class,user-interface,jbutton,Java,Eclipse,Class,User Interface,Jbutton,我正在做一个词汇测试程序,当他们点击一个选项时,一个新窗口会弹出,告诉他们是对是错。这是可行的,但是当窗口中的按钮给你返回测验的选项时,它没有显示出来,破坏了继续下一个问题的机会,或者更糟的是,破坏了回答当前问题的机会 以下是主要的测验代码: import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.

我正在做一个词汇测试程序,当他们点击一个选项时,一个新窗口会弹出,告诉他们是对是错。这是可行的,但是当窗口中的按钮给你返回测验的选项时,它没有显示出来,破坏了继续下一个问题的机会,或者更糟的是,破坏了回答当前问题的机会

以下是主要的测验代码:

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame; 
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DataFormatter;


public class SAT extends JFrame implements ActionListener{

private JButton buttonA; 
private JButton buttonB;
private JButton buttonC;
private JButton buttonD;
private JPanel panel1;
private JFrame frame1;
private JTextField Text1;
private JLabel label1;

public static final String POOP = "Words3.xls"; //everywhere that there is POOP is the excel sheet
public static String read1(int rowIndex, int colIndex, int a)
{   
    String value = new String();
    HSSFWorkbook wb = null;

    try {
            wb = new HSSFWorkbook(new FileInputStream(POOP));
        } catch (Exception e) {
           e.printStackTrace();
        }

    String sheet2=null;//placeholder
    if (a==1){sheet2="SAT";}//one of these for each sheet
    if (a==2){sheet2="Test";}
    if (a==3){sheet2="vwlvlHU1";}

    HSSFSheet sheet = wb.getSheet(sheet2);
    HSSFRow row=sheet.getRow(rowIndex-1);
    HSSFCell cell=row.getCell(colIndex-1);

    DataFormatter formatter = new DataFormatter();
    value = formatter.formatCellValue(cell);

    return value;
}

private static void saveWorkbook(HSSFWorkbook wb) throws IOException
{
    FileOutputStream out = new FileOutputStream(POOP);
    wb.write(out);
    out.close();
}

public static int RNG1(int a) { //this RNG is used to find the word and random definitions
    //RNG code:
    int min=1;//1
    int max=100;//number of flash cards, highest number, this is a placeholder
    if (a==1){max=253;}//we will have one of these statements for each set
    if (a==2){max=20;}
    if (a==3){max=40;}
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min + 1;//the +1 is so it doesn't choose header, maybe remove
        return randomNum;
    }
public static int RNG2(int b) {//this RNG will be used to determine which button gets true definition
    //RNG code:
    int min=1;//1
    int max=4;//number of options
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;
        return randomNum;
    }

//FIND THE WORD AND POS
int a=1;//tells methods to look in right set
int rowIndex=RNG1(a);//here is where a random word, pos, and def will be called for
int colIndex=1;//use colIndex=1 to show word
String WORD=read1(rowIndex,colIndex,a);//to pull word
//System.out.println("Word: "+WORD);
int colIndexPOS=2;//POS=part of speech/colIndexPOS=2 for part of speech
String POS=read1(rowIndex,colIndexPOS,a);
//System.out.println("Part of speech: "+POS);


int b=1;//placeholder
int location=RNG2(b);
//if location=1, put it in button 1 and have random definitions for other 3
//if location=2... same for 3 and 4

private String def(){
//TRUE DEFINITION:
int colIndexDEF=3;//DEF= definition/colIndexPOS=3 for definitions
String DEF=read1(rowIndex,colIndexDEF,a);
return DEF;

}
//FAKE DEFINITIONS:

//fake def 1:
private String rdef1(){//THIS BLOCK HAS AN ISSUE. SHOULD NOT BE DIVIDED BY CURLY BRACES BUT IT IS AN ERROR IF THEY ARE NOT THERE. MAYBE MAKE IT A METHOD?
int rowIndex1=0;//null value
int colIndexDEF=3;
String weirdo="WHY";
do{
rowIndex1=RNG1(a);
weirdo=read1(rowIndex1, colIndexPOS, a);
}while(rowIndex1==rowIndex || !weirdo.equals(POS));
String RANDDEF1=read1(rowIndex1, colIndexDEF, a);
return RANDDEF1;
}

//fake def 2:
private String rdef2(){//FIX DOWHILE
int rowIndex2=1;//null value
int colIndexDEF=3;
String POSsave1=null;
//do{
rowIndex2=RNG1(a);
POSsave1=read1(rowIndex2, colIndexPOS, a);
//}while(rowIndex2==rowIndex1 || rowIndex2==rowIndex || !POSsave1.equals(POS));
String RANDDEF2=read1(rowIndex2, colIndexDEF, a);
return RANDDEF2;
}

//fake def 3:
private String rdef3(){//FIX DOWHILE
int rowIndex3=1;//null value
int colIndexDEF=3;
String POSsave2=null;
//do{
rowIndex3=RNG1(a);
POSsave2=read1(rowIndex3, colIndexPOS, a);
//}while(rowIndex3==rowIndex || rowIndex3==rowIndex2 || rowIndex3==rowIndex1 || !POSsave2.equals(POS));
String RANDDEF3=read1(rowIndex3, colIndexDEF, a);
return RANDDEF3;
}


private void createButtonA() {
    String definition=null;
    if (location==1){
    definition=def();
    }
    if (location==2){
    definition=rdef1();
    }
    if (location==3){
    definition=rdef2();
    }
    if (location==4){
    definition=rdef3();
    }
    buttonA = new JButton(definition);

    add(buttonA);
    buttonA.setContentAreaFilled(false);  
    buttonA.addActionListener((ActionListener) this);//this allows an action to be performed when the button is pressed
    buttonA.setForeground(Color.blue);

    buttonA.setBounds(45,130,295,25);


}
private void createButtonB() {

    String definitionB=null;
    if (location==1){
    definitionB=rdef1();
    }
    if (location==2){
    definitionB=def();
    }
    if (location==3){
    definitionB=rdef3();
    }
    if (location==4){
    definitionB=rdef2();
    }
    buttonB = new JButton(definitionB);
    add(buttonB);
    buttonB.setContentAreaFilled(false);  
    buttonB.addActionListener((ActionListener) this);//this allows an action to be performed when the button is pressed
    buttonB.setForeground(Color.blue);
    buttonB.setBounds(45,95,295,25);
}
private void createButtonC() {
    String definitionC=null;
    if (location==1){
    definitionC=rdef2();
    }
    if (location==2){
    definitionC=rdef3();
    }
    if (location==3){
    definitionC=def();
    }
    if (location==4){
    definitionC=rdef1();
    }
    buttonC = new JButton(definitionC);
    add(buttonC);
    buttonC.setContentAreaFilled(false);  
    buttonC.addActionListener((ActionListener) this);//this allows an action to be performed when the button is pressed
    buttonC.setForeground(Color.blue);  

    buttonC.setBounds(45,60,295,25);
}
private void createButtonD() {
    String definitionD=null;
    if (location==1){
    definitionD=rdef3();
    }
    if (location==2){
    definitionD=rdef2();
    }
    if (location==3){
    definitionD=rdef1();
    }
    if (location==4){
    definitionD=def();
    }
    buttonD = new JButton(definitionD);
    add(buttonD);
    buttonD.setContentAreaFilled(false);  
    buttonD.addActionListener((ActionListener) this);//this allows an action to be performed when the button is pressed
    buttonD.setForeground(Color.blue);

    buttonD.setBounds(45,25,295,25);
}

public static void main(String[] args) {
    SAT frameTable = new SAT();

    //frameTable.SAT();  //Creating Frame

    frameTable.createButtonA();  //Creating Button 1
    frameTable.createButtonB(); //Creating Button 2
    frameTable.createButtonC();//Creating button 3
    frameTable.createButtonD();//Creating button 3


}

public SAT() {//problem
    Container window = getContentPane();

    window.setLayout(new FlowLayout() ); //using the FlowLayout manager

    setSize(400,250); //setting the size of the initial box

    setVisible(true); //allows for manual size changing of the box

    setTitle("FlaQuiZ"); //Title for the GUI

    window.setBackground(Color.white);

    setLocation(500,280);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Allows us to actually exit when we click the "X"

    panel1 = new JPanel(new GridLayout());

    add(new JLabel("Choose the option that best fits this word: "+WORD));


    //add(new JLabel(""));

}


public void actionPerformed(ActionEvent i) {


    if ( location==1 && i.getSource() == buttonA || location==2 && i.getSource()==buttonB || location==3 && i.getSource()==buttonC || location==4 && i.getSource()==buttonD) { 
     GRATS congrats =new GRATS();
        congrats.setVisible(true);
        dispose();
    }
    else{
        NO bad =new NO();
        bad.setVisible(true);
        dispose();
    }

    }

}
如果他们搞错了,下面是代码,按钮应该出现,提供返回的选项:

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
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.JLabel;
import javax.swing.JPanel;


public class NO extends JFrame implements ActionListener{

private JButton NOB;
private JPanel panel3;

public NO() { 



    Container window = getContentPane();

    window.setLayout(new FlowLayout() ); //using the FlowLayout manager

    setSize(275,160); //setting the size of the initial box

    setVisible(true); //allows for manual size changing of the box

    setTitle("Flaquiz"); //Title for the GUI

    window.setBackground(Color.white);

    setLocation(500,280);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Allows us to actually exit when we click the "X"

    JPanel panel3 = new JPanel(new GridLayout());

    add(new JLabel("Uh oh, you got it wrong!"));

    //add(new JLabel(""));

    }
public static void main(String[] args) {
    NO bad = new NO();
    //frameTable.SAT();    //Creating Frame
   bad.createbuttonNOB();  //Creating Button 1
}

private void createbuttonNOB() {

    NOB = new JButton("Go Back");
    add(NOB);
    NOB.setContentAreaFilled(false);  
    NOB.addActionListener((ActionListener) this);//this allows an action to be performed when the button is pressed
    NOB.setForeground(Color.blue);  
    NOB.setBounds(45,45,45,45);
}


public void actionPerformed(ActionEvent i) {
    if (i.getSource() == NOB ) { 
     SAT goback =new SAT();
        goback.setVisible(true);
        dispose();
    }
}
}

我可能遗漏了一些东西,但似乎您直接将按钮添加到JFrame,即使您有一个JPanel占据了整个框架。为什么不将按钮添加到JPanel


旁注:在NO构造函数中,SetVisible不确定是否可以手动更改大小。这是由诸如SetMaximumSize、SetMinimumSize和setResizeable之类的东西控制的

Protip:不要对每一行都加注释,尽量把函数和变量命名得足够好,这样就很容易知道它们是做什么的