使用Java开发一个记事本,实现查找一段字符并且定位到字符所在位置,我的主类调用另一个类(我们叫它A类)中的一个方法来获取字符串在文本中的位置index,这个index的值再A类中,我想将这个index的值再重新传回我的主类当中,以实现定位功能,但是由于项目问题我无法再重新new一个主类,new一个主类传值会重新生成一个记事本界面且文本域中无内容,所以有没有其它的方法将index变量的值传回我的主类当中。谢谢。
哈哈哈好,最近我也在用GUI写界面,一个Redis的客户端,我也经常遇到这个值到处传递的问题。
我最常用的办法就是,被调用的类也就是你说的A类,写一个返回的方法返回index值
这是最直接的。如果这个不行。那就在主类写一个回调的钩子函数,再把主类或者钩子函数传递到A中,在完成查找之后调用主类的钩子函数,将index给主类,还有很多其他的,看场景。
我不知道你的主类是什么就叫它R吧
class R(){
public void indexCallback(int index){
...
}
}
Tihuan(R r,String listx){
this.r = r;
}
Tihuan find=new Tihuan(this, youInput);
if(index==-1) {
JOptionPane.showMessageDialog(null, "没有找到目标字符,请重新确认(查找为大小写敏感)");
}
else {
//新弹出一个对话框显示你要查找的字符串再我文档的第几个
JOptionPane.showMessageDialog(null,index+1);
r.indexCallback(index);
//希望将index的值传回上面主类中的方法
}
消息通知。
ThreadLocal。
其它。
没看明白,建议附上关键代码(本编辑器支持markdown,可对代码格式化)?
主类:
//上面有构建主窗体的构造方法
find.addActionListener(new ActionListener() {
/*
*实现查找
*将文本域中的内容通过Tihuan类的构造方法传入Tihuan类中,
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
//获取列数
//获取文本域内输入的内容
String youInput=input.getText();
// gettedList=new ArrayList<String>();
Tihuan find=new Tihuan(youInput);
}
});
Tihuan类:
Tihuan(String listx) {
//setFrame构建查找对话框
setFrame();
addListen(listx);
}
//将查找按钮绑定事件
public void addListen(String list) {
but1.addActionListener(new ActionListener() {
// 查找的按钮绑定
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
int column,line;//column is 列,line is 行
index=list.indexOf(fiel.getText());
// line=index/row+1;
// column=index%row;
if(index==-1) {
JOptionPane.showMessageDialog(null, "没有找到目标字符,请重新确认(查找为大小写敏感)");
}
else {
//新弹出一个对话框显示你要查找的字符串再我文档的第几个
JOptionPane.showMessageDialog(null,index+1);
//希望将index的值传回上面主类中的方法
}
}
});
}
@01-cheng: 我还是每太看明白。这样写的话会有什么问题:
class Main
{
void myFunc()
{
A a = new A();
a.doSomting();
int index = a.Index;
}
}
面向对象设计思想早已不是什么新鲜事物,在Java实际项目中也是主流的编程思想。 正是因为Java,C#天然就是支持面向对象的,反而很多童鞋并不能讲清楚什么是面向对象。
/**
* Description: 大象类
*/
@Data
public class Elephant {
private Object head;//头
private List<Object> feets;//四肢
private Object body;//躯干
private Object tail;//尾巴
public String toString(){
return "大象";
}
}
实例化一头大象
//实例化一头大象
Elephant elephant=new Elephant();
实体化一个冰箱
//实体化一个冰箱
Fridge fridge=new Fridge();
调用冰箱的功能
fridge.openTheDoor();
fridge.store(elephant);
fridge.closeTheDoor();
可以定义一个全局缓存,用于保存这个值
我的理解:
一、主类只能有一个实例,就是单例的
二、index由A类的某个方法获取,A#getIndex(); 这个方法应该是递归的并且返回值是个数组或集合
三、在主类中使用index,最简单的方法,把getIndex();设置为static的,在主类中直接调用
A类:
public static List<Integer> getIndex(String textarea);
主类:
List<Integer> indexs = A.getIndex(textarea);
提供三类实现思路
思路一:让A类直接返回,可以返回一个比如Result 类,这个类可以按照你想要的字段来定义,主类调用A类时,A类返回Result实例,主类获取Result实例使用相应的值即可。
思路二:可以借助缓存、队列、文件等各类可以用来存储数据的介质,A类计算完成后把结果存储到存储介质,然后主类可以定时获取、事件触发获取等;
思路三:你做的是记事本程序,应该是桌面程序类。可以在你的程序界面中的某个区域放置一个label标签,属性设置为不可见状态,就是 visible 属性,设置为false(应该),你可以验证下。 然后可以把A类计算的结果放到 label标签中,然后主类去获取值,用完后把label设置为空或者0 等都可以。
以上三种可任选。