2014-10-16 205 views
1

我想給出一個彈出的JOptionPane MessageDialog,如果所需的項目打勾或未打勾,但我什麼都沒有得到。基本上我正在檢查使用動作偵聽器按下哪個按鈕,然後檢查在上一個窗口中選擇了哪個用戶。如果用戶不被允許,那麼它應該顯示一個彈出消息對話框告訴他們,否則它應該檢查所需的項目是否在JCheckBox中打勾,如果勾選了正確的項目,它應該顯示一個消息對話框「歡迎」到房間。JButtons,ActionListener和JOptionPane

這些類是在不久前發佈的,我知道我應該更好地將它們命名爲變量。這是一個相當舊的項目,我從來沒有完成過,所以我編程的方式有很多缺陷,所以請不要打電話給我,儘管歡迎提示。

即使我說這是一箇舊項目,我仍然不擅長Java,而且我仍然在學習,所以我的代碼顯然不完美。

一些名稱和信息是在南非荷蘭語中,所以如果有什麼你不明白的只是問,我會爲你改變它。

我無法弄清楚如何使用該網站的代碼突出顯示,我希望我做對了,對不起。

主要類:

import javax.swing.JFrame; 

public class main { 
public static void main(String args[]){ 

    window1 w1Ob = new window1(); 
    w1Ob.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    w1Ob.setSize(250,250); 
    w1Ob.setVisible(true); 
    w1Ob.setLocationRelativeTo(null); 
    w1Ob.setResizable(true); 

} 
} 

第一窗口類:

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

//has to extend JFrame to use content from JFrame, cannot import to here but can to main class, not sure how it 
//works 
public class window1 extends JFrame{ 

//creating window2 object to run window2 if inserted password is correct 
window2 wO2 = new window2(); 

//adds needed variables 
//adds jlist which is the used list 
private JList list; 
//names used in the jlist, jlist uses string array 
private static String[] usernames = {"Jannie", "Heloise", "Juan", "Chane"}; 
//font used to make text larger 
Font font = new Font("Sans-Serif", Font.BOLD, 24); 
//attempt at making a password array that stores all the passwords as strings then is used in an if statement 
//to check if correct 
private static int[] passwords = {1, 2, 3, 4}; 
//creating variable to know which user is logged in 
public int loggedUser; 

//constructor to create the window 
public window1(){ 
    //title 
    super("Project"); 
    //the layout used, FlowLayout, most basic layout as temporary solution until learning new one 
    setLayout(new FlowLayout()); 

    //tells the jlist to use the usernames string array to display in the list, meaning it will display 
    //Jannie on list 1, Heloise on line 2, etc. 
    list = new JList(usernames); 
    //tells the jlist how many lines to display, if array contains > 4 strings and is told to display only 
    //4 it will give a scroll bar 
    list.setVisibleRowCount(4); 
    //makes sure only 1 item in the list is selected 
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    //sets the jlist lists' font to preset font in variable at the top of the class 
    list.setFont(font); 
    //adds the jlist to the screen 
    add(new JScrollPane(list)); 

    //adds the listener to wait for the user to select an item in the list, thus "ListSelection" 
    list.addListSelectionListener(
      //anonymous class insides parameters for adding the listener to list 
      new ListSelectionListener(){ 
       //obligatory overwrite, parameters of "ListSelectionEvent event" obligatory, not sure what 
       //it does... 
       public void valueChanged(ListSelectionEvent event){ 
        //creating the OptionPane for the password 
        String pass = JOptionPane.showInputDialog(null, "Enter Password"); 
        //converts pass to string under variable name i 
        int i = Integer.parseInt(pass); 
        //checks if entered value is equal to the value in the array, example, Jannie = list[0] 
        //because it's the first value in array list and 1 = pass[0] since it's the first value 
        //in array passwords, thus if 1 is entered it will be correct because it's the 
        //corresponding value in the arrays 
        if(i == passwords[list.getSelectedIndex()]){ 
         int selectedValue = list.getSelectedIndex(); 
         if(selectedValue == 0){ 
          loggedUser = 1; 
         } 
         else if(selectedValue == 1){ 
          loggedUser = 2; 
         } 
         else if(selectedValue == 2){ 
          loggedUser = 3; 
         } 
         else if(selectedValue == 3){ 
          loggedUser = 4; 
         } 
         wO2.setDefaultCloseOperation(EXIT_ON_CLOSE); 
         wO2.setSize(500, 500); 
         wO2.setVisible(true); 
         wO2.setLocationRelativeTo(null); 
         wO2.setResizable(true); 
        } 
       } 
     } 
    ); 

} 

} 

二窗口類:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 

public class window2 extends JFrame{ 

//adding JButton variables for each button on the screen 
private JButton garage; 
private JButton kombuis; 
private JButton badkamer; 
private JButton mancave; 
//adding JCheckBox variables for each required item 
public JCheckBox sleutel; 
public JCheckBox helmet; 
public JCheckBox voorskoot; 
public JCheckBox beker; 
public JCheckBox handdoek; 
public JCheckBox seep; 
public JCheckBox musiek; 
//adding String variable to tell the user what he requires to enter the area he wants 
private String youNeed; 


private JButton button; 


public window2(){ 
    //title 
    super("Access"); 
    //3 rows (int), 4 columns (int), 15 px horizontal gap (int), 15 px vertical gap (int) 
    setLayout(new GridLayout(3, 4, 2, 5)); 

    //gives parameters for garage, puts text "Garage" on the button 
    garage = new JButton("Garage"); 
    //adds garage JButton to the screen 
    add(garage); 

    //gives parameters for kombuis, puts text "Kombuis" on the button 
    kombuis = new JButton("Kombuis"); 
    //adds kombuis JButton to the screen 
    add(kombuis); 

    //gives parameters for badkamer, puts text "Badkamer" on the button 
    badkamer = new JButton("Badkamer"); 
    //adds badkamer JButton to the screen 
    add(badkamer); 

    //gives parameters for mancave, puts text "Mancave" on the button 
    mancave = new JButton("Mancave"); 
    //adds mancave JButton to the screen 
    add(mancave); 

    sleutel = new JCheckBox("Sleutel"); 
    add(sleutel); 
    helmet = new JCheckBox("Helmet"); 
    add(helmet); 
    voorskoot = new JCheckBox("Voorskoot"); 
    add(voorskoot); 
    beker = new JCheckBox("Beker"); 
    add(beker); 
    handdoek = new JCheckBox("Handdoek"); 
    add(handdoek); 
    seep = new JCheckBox("Seep"); 
    add(seep); 
    musiek = new JCheckBox("Musiek"); 
    add(musiek); 

    HandlerClass handler = new HandlerClass(); 
    //adds action listeners for following button to wait for user to select one 
    garage.addActionListener(handler); 
    kombuis.addActionListener(handler); 
    badkamer.addActionListener(handler); 
    mancave.addActionListener(handler); 

} 

private class HandlerClass implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 

     //create window1 object to use loggedUser variable from window1 
     window1 wo1 = new window1(); 

     //create variable using window1 object to use loggedUser variable in window2 class 
     int loggedU = wo1.loggedUser; 

     if(event.getActionCommand().equals(garage)){ 
      if(loggedU == 1){ 
       if(sleutel.isSelected() && helmet.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the garage, Jannie"); 
       } 
       else{ 
        if(sleutel.isSelected()){ 
         youNeed = "Helmet"; 
        } 
        else if(helmet.isSelected()){ 
         youNeed = "Sleutel"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else if(loggedU == 3){ 
       if(sleutel.isSelected() && helmet.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the garage, Juan"); 
       } 
       else{ 
        if(sleutel.isSelected()){ 
         youNeed = "Helmet"; 
        } 
        else if(helmet.isSelected()){ 
         youNeed = "Sleutel"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "You're not allowed in here"); 
      } 
     } 
     if(event.getActionCommand().equals(badkamer)){ 
      if(loggedU == 1){ 
       if(handdoek.isSelected() && seep.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the bathroom, Jannie"); 
       } 
       else{ 
        if(handdoek.isSelected()){ 
         youNeed = "Seep"; 
        } 
        else if(seep.isSelected()){ 
         youNeed = "Handdoek"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else if(loggedU == 2){ 
       if(handdoek.isSelected() && seep.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the bathroom, Heloise"); 
       } 
       else{ 
        if(handdoek.isSelected()){ 
         youNeed = "Seep"; 
        } 
        else if(seep.isSelected()){ 
         youNeed = "Handdoek"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else if(loggedU == 3){ 
       if(handdoek.isSelected() && seep.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the bathroom, Juan"); 
       } 
       else{ 
        if(handdoek.isSelected()){ 
         youNeed = "Seep"; 
        } 
        else if(seep.isSelected()){ 
         youNeed = "Handdoek"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else if(loggedU == 4){ 
       if(handdoek.isSelected() && seep.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the bathroom, Chane"); 
       } 
       else{ 
        if(handdoek.isSelected()){ 
         youNeed = "Seep"; 
        } 
        else if(seep.isSelected()){ 
         youNeed = "Handdoek"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
     } 
     if(event.getActionCommand().equals(kombuis)){ 
      if(loggedU == 2){ 
       if(voorskoot.isSelected() && beker.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the kombuis, Heloise"); 
       } 
       else{ 
        if(voorskoot.isSelected()){ 
         youNeed = "beker"; 
        } 
        else if(beker.isSelected()){ 
         youNeed = "voorskoot"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else if(loggedU == 4){ 
       if(voorskoot.isSelected() && beker.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the kombuis, Chane"); 
       } 
       else{ 
        if(voorskoot.isSelected()){ 
         youNeed = "beker"; 
        } 
        else if(beker.isSelected()){ 
         youNeed = "voorskoot"; 
        } 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "You're not allowed in here"); 
      } 
     } 
     if(event.getActionCommand().equals(mancave)){ 
      if(loggedU == 1){ 
       if(musiek.isSelected()){ 
        JOptionPane.showMessageDialog(null, "Welcome to the mancave, Jannie"); 
       } 
       else{ 
        youNeed = "musiek"; 
        JOptionPane.showMessageDialog(null, "You do not have the required items, you need: " + youNeed); 
       } 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "You're not allowed in here"); 
      } 
     } 
    } 
} 
} 

預先感謝在解決/解決方案的任何企圖。

回答

3

對此代碼:

private class HandlerClass implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
    window1 wo1 = new window1(); // ***** problem is here ***** 
    int loggedU = wo1.loggedUser; 
    if (event.getActionCommand().equals(garage)) { 

這對於調試目的,我已經改爲:

private class HandlerClass implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
    window1 wo1 = new window1(); // ***** problem is here ***** 
    int loggedU = wo1.loggedUser; 
    System.out.println("action command: " + event.getActionCommand()); //!! 
    System.out.println("loggedU: " + loggedU); 
    if (event.getActionCommand().equals(garage)) { 

你會看到,loggedU總是返回。

你的問題是一個常見的新手錯誤 - 你正在創建一個新的window1對象w02,並且假設它的狀態與先前創建的window1對象相同,這不是Java的工作方式。要獲得原始window1對象的狀態,您需要測試它,而不是一個新的不同的實例。


例如,

import java.awt.Dialog.ModalityType; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.Window; 

import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class MyTest { 
    private static void createAndShowGui() { 
     MainGuiPanel mainGuiPanel = new MainGuiPanel(); 

     final JFrame frame = new JFrame("MyTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainGuiPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     // frame.setVisible(true); 

     DialogPanel dialogPanel = new DialogPanel(); 
     JDialog dialog = new JDialog(frame, "Select User", ModalityType.APPLICATION_MODAL); 
     dialog.add(dialogPanel); 
     dialog.pack(); 
     dialog.setLocationRelativeTo(null); 
     // show modal dialog 
     dialog.setVisible(true); 

     // here dialog is no longer visible 

     // extract datat from dialog's dialogPanel 
     String selectedUser = dialogPanel.getSelectedName(); 
     // put into the main GUI 
     mainGuiPanel.setSelectedUser(selectedUser); 
     // now show the main GUI's JFrame 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class MainGuiPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private JButton doItButton = new JButton(new DoItAction("Do It!", KeyEvent.VK_D)); 
    private String selectedUser; 

    public MainGuiPanel() { 
     add(doItButton); 
    } 

    public void setSelectedUser(String selectedUser) { 
     this.selectedUser = selectedUser; 
    } 

    private class DoItAction extends AbstractAction { 
     public DoItAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("Selected User: " + selectedUser); 
     } 
    } 
} 

class DialogPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public static final String[] USER_NAMES = { "Jannie", "Heloise", "Juan", "Chane" }; 
    private JList<String> userList = new JList<>(USER_NAMES); 
    private String selectedName; 

    public DialogPanel() { 
     userList.addListSelectionListener(new UserListListener()); 
     add(new JScrollPane(userList)); 
    } 

    public String getSelectedName() { 
     return selectedName; 
    } 

    private class UserListListener implements ListSelectionListener { 

     @Override 
     public void valueChanged(ListSelectionEvent e) { 
     if (!e.getValueIsAdjusting()) { 
      selectedName = userList.getSelectedValue(); 
      if (selectedName != null) { 
       Window win = SwingUtilities.getWindowAncestor(DialogPanel.this); 
       win.dispose(); 
      } 
     } 
     } 
    } 
} 

編輯
你的代碼不考慮字符串大小寫考慮!

變化:

if (event.getActionCommand().equals(garage)) { 

到:

if (event.getActionCommand().equalsIgnoreCase(garage)) { 
+0

我認爲它有一些東西需要與變量需要恢復的,因爲該類超出範圍。所以基本上所有的變量都會在window1超出範圍之後立即回到原始狀態? – Tertles 2014-10-16 21:07:46

+0

我設法使用你告訴我的解決記錄的問題,謝謝一堆,但消息對話框仍然沒有出現。爲什麼是這樣? – Tertles 2014-10-16 21:12:36

+0

@Tertles:以前是因爲你的block測試從來都不是真的,因爲你的loggingUI總是0.這就是爲什麼我在你的代碼中放置調試'System.out.println'代碼來檢查這個變量的狀態。時間讓你做一些調試。請注意,如果這是我的代碼,我會用不同的方法做事,使用JDialog等。例如,請參閱我上面發佈的代碼,瞭解我是如何將信息從一個類傳遞到另一個類的。 – 2014-10-16 21:14:52