所以基本上我有一个主(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();
}
}
} } }
答案 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的概念性示例。
这里的想法是,Frame2UserInput
或DrawDriver
对彼此都没有任何想法(也不应该真正了解DrawDriver
)。 interface
是两者之间的桥梁,根据需要在它们之间传递信息。
这将解耦您的代码并使其在将来更容易修改和扩展,因为更改一个部分不应该改变其他部分的工作方式。为此,您应该大量使用static
来定义这些类之间的核心契约逻辑。
另外,不要依赖StudentAnwser=()
inputScriptFile=001.sh
while IFS= read -r line;
do
StudentAnwser+=( "$line" )
done < <( sh $inputScriptFile test.txt )
,它不会帮助你,你应该学会在没有它的情况下工作
答案 2 :(得分:1)
点运算符
object.objectMethod();
该方法必须是公共的,或者如果存在一定程度的继承,则受到保护。多态性继续
对于你的情况,几点指示:
panel1
或panel2
是变量的可怕名称。
接下来,您需要在DrawDriver类中拥有一个对象来调用对象方法
答案 3 :(得分:1)
你可以