2014-12-12 4 views
0

Я делаю программу линкора, которую я пытаюсь работать с графическим интерфейсом, но он не хочет работать. Теоретически он должен работать, так это то, что графический интерфейс запускается, он выдает вопрос в поле (которое работает), а затем компьютер ждет и ничего не выполняет, пока вы не нажмете кнопку после ответа на вопрос. Проблема в том, что мой метод, который ждет, пока вы не нажмете кнопку, чтобы получить данные в текстовом поле, ничего не делает. Я написал аналогичную часть кода, которая демонстрирует мою проблему ниже.Моя кнопка качания Java не работает

Test.java (основной класс)

package taest; 
import javax.swing.*; 

public class Test { 
    public static void main(String args[]){ 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       @SuppressWarnings("unused") 
       JFrame frame = new Frame(); 
      } 
     }); 
     Frame.display.setText(getButtonClick()); 
     } 
    public static String getButtonClick(){ 
     while(true){ 
      if (Frame.hasClicked){ 
       break; 
      } 
     } 
     return Frame.text.getText(); 
    } 
} 

Frame.java (класс Frame) пакет taest;

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

import javax.swing.*; 

public class Frame extends JFrame{ 
    JFrame panel = new JFrame("Something"); 
    public static JTextArea text = new JTextArea(); 
    JButton button = new JButton("Click"); 
    public static JTextField display = new JTextField("NOthing"); 
    static boolean hasClicked = false; 
    static String storage = ""; 

    public Frame(){ 
     setLayout(new BorderLayout()); 
     setSize(400,400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       hasClicked = true; 
       storage = text.getText(); 
      } 

     }); 

     Container c = getContentPane(); 
     c.add(display, BorderLayout.CENTER); 
     c.add(text, BorderLayout.PAGE_START); 
     c.add(button, BorderLayout.PAGE_END); 

     setVisible(true); 
    } 
} 
+1

'static' не является механизмом межклассовой коммуникации и особенно бесполезен в среде GUI. – MadProgrammer

+1

Вы рассматриваете использование [Pattern наблюдателя] (http://www.oodesign.com/observer-pattern.html) – MadProgrammer

ответ

3
  • Static не является вашим другом, и его использование должно быть весьма ограниченным. Он НИКОГДА не должен использоваться для обеспечения «легкого» доступа к полям класса для связи между классами.
  • Вам необходимо включить концепцию на ее голове и, возможно, использовать какой-то Observer Pattern. Здесь у вас есть класс, который «наблюдает» изменения в вашем другом классе. Когда происходит изменение, наблюдаемый класс уведомляет наблюдательный класс об изменении. Это разъединяет ответственность как наблюдаемый класс не должен заботиться за уведомление заинтересованных сторон о чем-то, что происходит

как действительно примитивный пример ...

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Test { 

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

    public Test() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       @SuppressWarnings("unused") 
       JFrame frame = new Frame(new ViewController() { 
        @Override 
        public void messageChanged(View view, String msg) { 
         view.appendLog(msg); 
        } 
       }); 
      } 
     }); 
    } 

    public interface ViewController { 

     public void messageChanged(View view, String msg); 

    } 

    public interface View { 

     public void appendLog(String log); 

    } 

    public class Frame extends JFrame implements View { 

//  JFrame panel = new JFrame("Something"); 
     private JTextArea text = new JTextArea(5, 5); 
     private JButton button = new JButton("Click"); 
     private JTextField display = new JTextField("NOthing"); 
     private String storage = ""; 

     private ViewController viewController; 

     public Frame(ViewController controller) { 
      this.viewController = controller; 
      setLayout(new BorderLayout()); 
      setSize(400, 400); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        storage = text.getText(); 
        viewController.messageChanged(Frame.this, storage); 
       } 

      }); 

      System.out.println("display = " + display.hashCode()); 
      System.out.println("text = " + text.hashCode()); 

      Container c = getContentPane(); 
      c.add(display, BorderLayout.CENTER); 
      c.add(text, BorderLayout.PAGE_START); 
      c.add(button, BorderLayout.PAGE_END); 

      setVisible(true); 
     } 

     @Override 
     public void appendLog(String log) { 
      display.setText(log); 
     } 
    } 

} 

Вы также должны стать farmiluar в рамках концепции Model–view–controller

0

Вы Путаете,

Перво-наперво, разница между классами и объектами. Класс является планом для объекта, поэтому пример класса - Car. Однако проект такого объекта ничего не знает о состоянии конкретного экземпляра этого класса, позволяет предположить, что вы ведете 100 км/м, тогда у вас есть экземплярCar, который хранит, что он идет со скоростью 100 км/, Чертежи - это классы, объекты - это экземпляры.

Итак, public class Car делает чертеж для автомобилей, а new Car() представляет конкретный экземпляр этого плана, в котором вы можете хранить информацию о времени выполнения.

Теперь есть способ сказать Java, что вещи принадлежат чертежу, статические. Если переменная является статической, она привязана к чертежу. Поэтому, чтобы идти в ногу с аналогией автомобилей, статическая переменная для автомобиля может быть его колесной базой, то есть то, что определено в compiletime (или в аналогии автомобилей при создании времени).

Обратно к вашей проблеме, вы смешиваете классы и объекты, то, что вы хотите сделать, есть BattleshipWindow, из которых существуют экземпляры. Из этого BattleshipWindow экземпляр может быть создан с помощью new, а затем его свойства могут быть изменены.

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

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