2016-03-22 3 views
0

Так что в основном у меня есть основной (DrawDriver), где я создаю 2 объекта в верхней части.Как получить доступ к методам объектов через другой класс?

public class DrawDriver { 

    public static void main(String[] args) { 

    final GraphicPanel pannel1 = new GraphicPanel();   
    final Frame2UserInput pannel2 = new Frame2UserInput(); 

    TitledBorder border = new TitledBorder("Input"); 
    border.setTitleColor(Color.BLACK);  
    pannel2.setBorder(border); 

    JFrame frame = new JFrame("DrawGoGo!"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setPreferredSize(new Dimension(500, 500)); 
    frame.setLayout(new GridLayout(2, 0)); 
    frame.pack();  
    frame.setVisible(true);  
    frame.setResizable(false); 

      // Creating the MENU BAR 

      JMenuBar menubar = new JMenuBar(); 
      frame.setJMenuBar(menubar); 
      JMenu file = new JMenu("File"); 
     menubar.add(file); 
     JMenuItem New = new 
      JMenuItem("New"); // Creates the jmenu item  
      file.add(New); // adds 
      JMenuItem Load = new JMenuItem("Load"); 
      file.add(Load);   
      JMenuItem Save = new JMenuItem("Save"); 
      file.add(Save);   
      JMenuItem Exit = new JMenuItem("Exit"); 
      file.add(Exit); 
      JMenu help = new JMenu("Help");  
      menubar.add(help);  

      JMenuItem about = new JMenuItem("About");   
      help.add(about); 

      frame.getContentPane().add(pannel1);   
      frame.getContentPane().add(pannel2); 



} 

В Frame2UserInput Я хочу получить доступ к экземпляру GraphicPanel через (основной) класса DrawDriver. Это будет холст, где я могу вводить команды в &, нажав кнопку &, тогда холст будет рисовать соответственно. Вы можете видеть, что я пытался получить к нему доступ уже в своем ActionListener, но не могу, потому что он делает новый экземпляр класса & ничего не меняет в программе (gui), которую я запускаю.

Как я могу получить доступ к объекту, который я создал для GraphicPanel в основном, но через другой класс? Любая помощь будет оценена благодарю вас!

public class Frame2UserInput extends JPanel { 

    private static JTextArea input;  
     private static JButton draw; 

     Frame2UserInput() { 

        input = new JTextArea(2,35);   
        add(input); 
        draw = new JButton("Draw!");   
        draw.addActionListener(new DrawListener());  
        add(draw);  
    }   

    private static class DrawListener implements ActionListener { 

      private String userInput; 
      GraphicPanel pannel1 = new GraphicPanel(); 

      public void actionPerformed(ActionEvent event) { 


      if (event.getSource()==draw) { 

      userInput = input.getText(); 
      System.out.println(userInput); 

      if (userInput.equalsIgnoreCase("penup")) { 

      } 

      if (userInput.equalsIgnoreCase("pendown")) { 

      } 

      if (userInput.equalsIgnoreCase("turnleft")) { 

      } 

      if (userInput.equalsIgnoreCase("turnright")) { 

      } 
      if (userInput.equalsIgnoreCase("black")) { 

      } 

      if (userInput.equalsIgnoreCase("green")) { 

      } 

      if (userInput.equalsIgnoreCase("red")) { 
       pannel1.drawLine(Color.RED,0,0,100,100); 
      } 

      if (userInput.equalsIgnoreCase("reset")) { 
       pannel1.clear(); 
      } 

         } 
       } } } 
+0

1. Swing не является потокобезопасным, весь этот код должен быть выполнен на EDT. 2. Обычно вы указываете ссылку класса, к которому хотите вызвать методы, попробуйте добавить параметр класса в ctor «Frame2UserInput». – markspace

+0

Этот тип материала - это OOP 101, который должен быть отсортирован задолго до того, как вы начнете использовать GUI. –

+0

@WreckTangle Вы можете использовать шаблон Observer. Например: [обновление изменений в другом классе] (http://stackoverflow.com/questions/35876982/updating-change-to-another-class/35877451#35877451) – user3437460

ответ

1

Оператор точки

object.objectMethod(); 

метод должен быть публичным, или защищены, если есть уровень наследования & полиморфизма происходит

В вашем случае, несколько указателей:

  • во-первых ваше правописание панель неверно.
  • осмысленные имена для имен переменных так очень важно

panel1 или panel2 ужасные имена переменных.

Далее, вы должны были бы иметь объект в классе DrawDriver для вызова метода объектов из

2

Возьмите его в качестве параметра.

final GraphicPanel pannel1 = new GraphicPanel();   
final Frame2UserInput pannel2 = new Frame2UserInput(pannel1); 

Новый Frame2UserInput конструктор:

Frame2UserInput(GraphicPanel pannel1) { 
    . 
    . 
    draw.addActionListener(new DrawListener(pannel1));  
} 

И новый DrawListener конструктор

DrawListener(GraphicPanel pannel1) { 
    . 
    . 
    //Don't need this just use pannel1 
    //GraphicPanel pannel1 = new GraphicPanel(); 
} 
+1

Хотя это работает (и концептуально у меня нет проблема), он подвергает «GraphicPanel» нежелательным изменениям (что останавливает «Frame2UserInput» от добавления/удаления контента или изменения других свойств), а также тесно связывает код. Это всего лишь вещи, которые OP должен знать, балансируя их выбор;) – MadProgrammer

+0

Согласитесь, это не лучший дизайн. Я предпочитаю шаблон Observer, как вы упомянули в своем ответе. Здесь я просто нашел обходное решение с минимальными изменениями. – rdonuk

2

В принципе, вы хотите, чтобы начать путем установки Observer Pattern, где DrawDriver прослушивает события из Frame2UserInput и делает изменения к примеру GraphicPanel.

Это также концептуальный пример парагдигма Model-View-Controller.

Идея здесь, ни GraphicPanel, ни Frame2UserInput не имеют ни малейшего представления друг о друге (и не должны знать о DrawDriver). DrawDriver - это мост между двумя, передавая информацию между ними по мере необходимости.

Это отделит ваш код и упростит его модификацию и расширение в будущем, так как изменение одной части не должно изменяться, как работают другие части. Для этого вам следует использовать interface s для определения основной договорной логики между этими классами.

Кроме того, не полагаться на static, это не помогает вам, и вы должны научиться работать без него

+0

1+ для дизайна и предупреждения о статических членах :) – user3437460

1

Вы можете

  1. сделать его в качестве параметра вашего класса
  2. сделать это как статический член класса (не рекомендуется). Но это экономит ваше время в некоторой степени, если вы работаете на одном холсте.
Смежные вопросы