Печать в текстовых полях GUI?

#java #swing #user-interface

#java #качать #пользовательский интерфейс

Вопрос:

Я пытаюсь создать программу лотереи с графическим интерфейсом на Java. Фактический код для лотерейной программы работает довольно хорошо, и я также создал графический интерфейс. Проблема в том, что я не могу запустить программу при нажатии кнопки «Перейти», и информация не отображается в соответствующих текстовых полях GUI.

Вот базовый код Lotto, в котором вообще отсутствует графический интерфейс:

     package slots;

    import java.util.*;

public class Slots {
static int displaynum[] = new int[5];
static int compnum[] = new int[5];
static int counter=0;
static int matchFound=0;
static int nummatch[] = new int[6];

public static void main(String[] args) {
    for(int z=0; z<5;z  ) {
        Random i = new Random();
      //Change 10 to 60
        compnum[z]=i.nextInt((10 - 1)   1)   1;
    }
    System.out.println(" "   compnum[0]  "  "   compnum[1]  "  "   compnum[2]  "  "   compnum[3]  "  "   compnum[4]);

    while(nummatch[5]==0) {
        nextGo();
        matchFound=0;
        if(compnum[0]==displaynum[0]) {
            matchFound  ;
        }
        if (compnum[1]==displaynum[1]){
            matchFound  ;
        }
        if (compnum[2]==displaynum[2]){
            matchFound  ;
        } 
        if (compnum[3]==displaynum[3]){
            matchFound  ;
        }
        if (compnum[4]==displaynum[4]){
            matchFound  ;
        }
        nummatch[matchFound]  ;
    }
    System.out.println("  Zero Matches="   nummatch[0]   "   One Matches="   nummatch[1]  "   Two Matches="    nummatch[2]  "   Three Matches="   nummatch[3]  "   Four Matches="   nummatch[4]  "   Total Draws="   counter);

}


static void nextGo() {
    for(int x=0;x<5;x  ) {
        Random i = new Random();
        //Change 10 to 60
        displaynum[x]=i.nextInt((10 - 1)   1)   1;
    }
    counter  ;

    System.out.println("  "   displaynum[0]  "  "   displaynum[1]  "  "   displaynum[2]  "  "   displaynum[3]  "  "   displaynum[4]);
}
 }
  

Итак, приведенный выше код показывает каждый розыгрыш лотереи и правильно отображает различные совпадения. Но у меня возникли проблемы с отображением тех же выходных данных в текстовых полях GUI.

Вот моя попытка объединить приведенный выше код и графический интерфейс:

     package slots;

    import java.awt.*; 
    import java.awt.event.*; 
    import java.util.Random;
    import java.util.*;

  public class LottoGUI extends Frame implements ActionListener {

private static TextField tfOne;
private static TextField tfTwo;
private static TextField tfThree;
private static TextField tfFour;
private static TextField tfFive;
private Label lblmnZero;
private static TextField mnZero;
private Label lblmnOne;
private static TextField mnOne;
private Label lblmnTwo;
private static TextField mnTwo;
private Label lblmnThree;
private static TextField mnThree;
private Label lblmnFour;
private static TextField mnFour;
private Label lbltfDraws;
private static TextField tfDraws;
private Button btnGo;
private Button btnClose;

public LottoGUI() {
    setLayout(new FlowLayout());

      tfOne = new TextField("", 2);
      tfOne.setEditable(false);
      add(tfOne);
      tfTwo = new TextField("", 2);
      tfTwo.setEditable(false);
      add(tfTwo);
      tfThree = new TextField("", 2);
      tfThree.setEditable(false);
      add(tfThree);
      tfFour = new TextField("", 2);
      tfFour.setEditable(false);
      add(tfFour);
      tfFive = new TextField("", 2);
      tfFive.setEditable(false);
      add(tfFive);

      lblmnZero = new Label("Zero Matches:");
      add(lblmnZero);
      mnZero = new TextField("");
      mnZero.setEditable(false);
      add(mnZero);
      lblmnOne = new Label("One Matches:");
      add(lblmnOne);
      mnOne = new TextField("");
      mnOne.setEditable(false);
      add(mnOne);
      lblmnTwo = new Label("Two Matches:");
      add(lblmnTwo);
      mnTwo = new TextField("");
      mnTwo.setEditable(false);
      add(mnTwo);
      lblmnThree = new Label("Three Matches:");
      add(lblmnThree);
      mnThree = new TextField("");
      mnThree.setEditable(false);
      add(mnThree);
      lblmnFour = new Label("Four Matches:");
      add(lblmnFour);
      mnFour = new TextField("");
      mnFour.setEditable(false);
      add(mnFour);
      lbltfDraws = new Label("Total Draws:");
      add(lbltfDraws);
      tfDraws = new TextField("");
      tfDraws.setEditable(false);
      add(tfDraws);

      btnGo = new Button("GO");
      add(btnGo);
      btnClose = new Button("CLOSE");
      add(btnClose);

      btnGo.addActionListener(this);
      btnClose.addActionListener(this);

      setTitle("Lotto");
        setSize(1000, 100);
        setVisible(true);
}

public static void main(String[] args) {
    new LottoGUI();

}

public static class Slots {
    static int displaynum[] = new int[5];
    static int compnum[] = new int[5];
    static int counter=0;
    static int matchFound=0;
    static int nummatch[] = new int[6];

    public static void main(String[] args) {
        for(int z=0; z<5;z  ) {
            Random i = new Random();
          //Change 10 to 60
            compnum[z]=i.nextInt((10 - 1)   1)   1;
        }
        //System.out.println(" "   compnum[0]  "  "   compnum[1]  "  "   compnum[2]  "  "   compnum[3]  "  "   compnum[4]);
        Object[] obcm0 = {compnum[0]};
        mnZero.setText(Arrays.toString(obcm0));
        Object[] obcm1 = {compnum[1]};
        mnOne.setText(Arrays.toString(obcm1));
        Object[] obcm2 = {compnum[2]};
        mnTwo.setText(Arrays.toString(obcm2));
        Object[] obcm3 = {compnum[3]};
        mnThree.setText(Arrays.toString(obcm3));
        Object[] obcm4 = {compnum[4]};
        mnFour.setText(Arrays.toString(obcm4));

        while(nummatch[5]==0) {
            nextGo();
            matchFound=0;
            if(compnum[0]==displaynum[0]) {
                matchFound  ;
            }
            if (compnum[1]==displaynum[1]){
                matchFound  ;
            }
            if (compnum[2]==displaynum[2]){
                matchFound  ;
            } 
            if (compnum[3]==displaynum[3]){
                matchFound  ;
            }
            if (compnum[4]==displaynum[4]){
                matchFound  ;
            }
            nummatch[matchFound]  ;
        }
        //System.out.println("  Zero Matches="   nummatch[0]   "   One Matches="   nummatch[1]  "   Two Matches="    nummatch[2]  "   Three Matches="   nummatch[3]  "   Four Matches="   nummatch[4]  "   Total Draws="   counter);
        Object[] obnm0 = {nummatch[0]};
        mnZero.setText(Arrays.toString(obnm0));
        Object[] obnm1 = {nummatch[1]};
        mnOne.setText(Arrays.toString(obnm1));
        Object[] obnm2 = {nummatch[2]};
        mnTwo.setText(Arrays.toString(obnm2));
        Object[] obnm3 = {nummatch[3]};
        mnThree.setText(Arrays.toString(obnm3));
        Object[] obnm4 = {nummatch[4]};
        mnFour.setText(Arrays.toString(obnm4));
        Object[] obcn = {counter};
        tfDraws.setText(Arrays.toString(obcn));
    }


    static void nextGo() {
        for(int x=0;x<5;x  ) {
            Random i = new Random();
            //Change 10 to 60
            displaynum[x]=i.nextInt((10 - 1)   1)   1;
        }
        counter  ;

        //System.out.println("  "   displaynum[0]  "  "   displaynum[1]  "  "   displaynum[2]  "  "   displaynum[3]  "  "   displaynum[4]);
        Object[] obdn0 = {displaynum[0]};
        tfOne.setText(Arrays.toString(obdn0));
        Object[] obdn1 = {displaynum[1]};
        tfTwo.setText(Arrays.toString(obdn1));
        Object[] obdn2 = {displaynum[2]};
        tfThree.setText(Arrays.toString(obdn2));
        Object[] obdn3 = {displaynum[3]};
        tfFour.setText(Arrays.toString(obdn3));
        Object[] obdn4 = {displaynum[4]};
        tfFive.setText(Arrays.toString(obdn4));
    }
}

public void actionPerformed(ActionEvent e) {
    String str = e.getActionCommand();

     if(str.equals("GO"))
        new Slots();

     else if (str.equals("CLOSE"))
        System.exit(0);
    }

}
  

Ничего не происходит, когда я нажимаю кнопку «ПЕРЕЙТИ». Может быть, я размещаю команды печати в неправильном разделе кода или я делаю что-то еще неправильно? Я был бы очень признателен за любые рекомендации по этому поводу.

Это также моя первая публикация на этом сайте, поэтому, если я что-то перепутал, пожалуйста, дайте мне знать. Я искал справку и не могу найти многого, что относится к моей проблеме. Спасибо!

Комментарии:

1. Похоже, вы пытаетесь объединить статическую линейную консольную программу с графическим интерфейсом, управляемым событиями, и это никогда не срабатывает. Во-первых, ваш цикл while блокирует поток событий Swing, что может привести к неработоспособности GUI. Вам нужно переписать логику вашей программы, чтобы она работала на основе событий. Создайте настоящие объекты и сделайте почти все ваши поля и методы нестатическими.

Ответ №1:

Похоже, вы пытаетесь объединить статическую линейную консольную программу с графическим интерфейсом, управляемым событиями, и это никогда не срабатывает. Во-первых, ваш цикл while блокирует поток событий Swing, что может привести к неработоспособности GUI. Вам нужно переписать логику вашей программы, чтобы она работала на основе событий. Создайте настоящие объекты и сделайте почти все ваши поля и методы нестатическими.

Например, я бы сделал большинство всех своих полей, за исключением констант, нестатическими. Я бы сделал большинство своих полей закрытыми и сделал общедоступными только те методы, которые должны вызываться другими классами. Я бы передал ссылки на объекты, которым необходимо вызывать методы исходного объекта. Например, вот небольшая программа, которая делает примерно то, что вы пытаетесь сделать (но не совсем так, как это было бы мошенничеством), и может дать представление о том, к чему я клоню:

 import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.*;

@SuppressWarnings("serial")
public class SimpleGui extends JPanel {
   private static final int TEXT_FIELD_COLUMNS = 3;
   private JTextField[] textFields = new JTextField[SimpleModel.VALUES_COUNT];
   private JButton goButton = new JButton(new GoAction("Go", KeyEvent.VK_G));
   private JButton exitButton = new JButton(new ExitAction("Exit",
         KeyEvent.VK_X));
   private SimpleModel simpleModel = new SimpleModel(this);

   public SimpleGui() {
      for (int i = 0; i < textFields.length; i  ) {
         textFields[i] = new JTextField(TEXT_FIELD_COLUMNS);
         textFields[i].setEditable(false);
         textFields[i].setFocusable(false);
         add(textFields[i]);
      }
      add(goButton);
      add(exitButton);
   }

   public void setTextFieldText(int index, String text) {
      if (index < 0 || index >= textFields.length) {
         throw new IllegalArgumentException("index: "   index);
      } else {
         textFields[index].setText(text);
      }
   }

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

      @Override
      public void actionPerformed(ActionEvent e) {
         simpleModel.go();
      }
   }

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

      @Override
      public void actionPerformed(ActionEvent e) {
         JButton btn = (JButton) e.getSource();
         Window win = SwingUtilities.getWindowAncestor(btn);
         win.dispose();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleGui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(new SimpleGui());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class SimpleModel {
   public static final int MAX_VALUE = 100;
   public static final int VALUES_COUNT = 4;
   private Random random = new Random();
   private SimpleGui simpleGui;
   private int[] values = new int[VALUES_COUNT];

   public SimpleModel(SimpleGui simpleGui) {
      this.simpleGui = simpleGui;
   }

   public void go() {
      for (int i = 0; i < values.length; i  ) {
         values[i] = random.nextInt(MAX_VALUE)   1;
         simpleGui.setTextFieldText(i, String.valueOf(values[i]));
      }

      // TODO: use the values array here
   }
}
  

Он передает ссылку из класса SimpleGUI в класс SimpleModel путем передачи this в конструктор модели:

 private SimpleModel simpleModel = new SimpleModel(this);
  

Модель берет эту ссылку и использует ее для установки поля GUI:

 class SimpleModel {
   //....

   private SimpleGui simpleGui;

   // ...

   public SimpleModel(SimpleGui simpleGui) {
      this.simpleGui = simpleGui;
   }
  

И затем метод go модели вызывает открытый метод GUI для задания текста текстового поля:

 public void go() {
  for (int i = 0; i < values.length; i  ) {
     values[i] = random.nextInt(MAX_VALUE)   1;
     simpleGui.setTextFieldText(i, String.valueOf(values[i]));
  }

  // TODO: use the values array here
}
  

Обратите внимание, что если бы это был true MVC, model-view-control, модель вообще не вызывала бы методы GUI, а скорее уведомляла бы слушателей об изменении состояния, но это для последующего обсуждения.

Комментарии:

1. Большое вам спасибо за всю информацию! Я продолжу работать над этим и использую приведенный выше код в качестве ссылки.

Ответ №2:

Вы забыли вызвать nextGo()

Заменить

 if(str.equals("GO"))
        new Slots();
  

с помощью

 if(str.equals("GO"))
        new Slots().nextGo();
  

Это должно решить проблему.

Обновление 1:

Пожалуйста, удалите static из nextGo() вы уверены, что ваш код компилируется при обращении к нестатическому объекту из статического метода?

Комментарии:

1. Спасибо! Это позволило отобразить некоторые числа в GUI, но мне все еще нужно поработать над этим еще немного.