如何通过不同的类访问对象方法?

时间:2016-03-22 01:08:48

标签: java swing oop

所以基本上我有一个主(DrawDriver),我在顶部创建了两个对象。

 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中我想通过DrawDriver(main)类访问GraphicPanel实例。这将是一个画布,我可以在&中输入命令。点击按钮&然后画布将相应地绘制。你可以看到我已经尝试在我的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();
            }

                        }
                }   }    }

4 个答案:

答案 0 :(得分: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 :(得分:2)

基本上,您希望首先设置Observer Pattern,其中Frame2UserInput侦听来自GraphicPanel的事件,并对GraphicPanel的实例进行更改。

这也是Model-View-Controller paragdigm的概念性示例。

这里的想法是,Frame2UserInputDrawDriver对彼此都没有任何想法(也不应该真正了解DrawDriver)。 interface是两者之间的桥梁,根据需要在它们之间传递信息。

这将解耦您的代码并使其在将来更容易修改和扩展,因为更改一个部分不应该改变其他部分的工作方式。为此,您应该大量使用static来定义这些类之间的核心契约逻辑。

另外,不要依赖StudentAnwser=() inputScriptFile=001.sh while IFS= read -r line; do StudentAnwser+=( "$line" ) done < <( sh $inputScriptFile test.txt ) ,它不会帮助你,你应该学会在没有它的情况下工作

答案 2 :(得分:1)

点运算符

object.objectMethod();

该方法必须是公共的,或者如果存在一定程度的继承,则受到保护。多态性继续

对于你的情况,几点指示:

  • 首先,面板的拼写错误。
  • 有意义的名称对于您的变量名称非常重要

panel1panel2是变量的可怕名称。

接下来,您需要在DrawDriver类中拥有一个对象来调用对象方法

答案 3 :(得分:1)

你可以

  1. 将其作为您班级的参数
  2. 将其设为静态类成员(不推荐)。但如果你在同一个画布上操作,它会在一定程度上节省你的时间。