Java 从数组循环中的另一个类访问JTextArea的实例。什么';这是最好的办法吗?
我在概念上遇到了一些问题,无法理解如何使我的应用程序工作 我有15个JTextField组件、15个JButton组件和1个JTextArea。我希望每个按钮在文本区域内插入来自每个对应文本字段的文本 如果您希望看到解释此设置的图形-[http://i.imgur.com/Vnc3C.png]这里 我已经设法将frame.finaltext添加到课程主题类中,但在actionPerformed方法中看不到它 获取frame.finaltext.append(textfields[i])的最佳方式是什么 短暂性脑缺血发作 亚当Java 从数组循环中的另一个类访问JTextArea的实例。什么';这是最好的办法吗?,java,arrays,swing,Java,Arrays,Swing,我在概念上遇到了一些问题,无法理解如何使我的应用程序工作 我有15个JTextField组件、15个JButton组件和1个JTextArea。我希望每个按钮在文本区域内插入来自每个对应文本字段的文本 如果您希望看到解释此设置的图形-[http://i.imgur.com/Vnc3C.png]这里 我已经设法将frame.finaltext添加到课程主题类中,但在actionPerformed方法中看不到它 获取frame.finaltext.append(textfields[i])的最佳方式
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入net.miginfocom.swing.MigLayout;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.JButton;
导入java.awt.Dimension;
公共课程主题扩展JPanel实现ActionListener{
/**
*这是一个包含每个主题详细信息的类。
*/
//首先我们需要一些变量
字符串subjectName;
公共课程科目(最终报告框架){
MigLayout布局=新的MigLayout(“包装2”);/,调试4000”);
这个.setLayout(布局);
最终JTextField[]textfields=新JTextField[15];
JButton[]按钮=新JButton[15];
对于(int i=0;i我不知道JReport是什么,但是为什么不在其中提供一个方法来接受字符串(或者创建一个提供此方法的JReport子类):
更新:
您似乎有许多小部件需要跟踪。我建议引入一种模式,使您的应用程序更易于管理。短期内,您可以尝试通过setter或构造函数参数将finaltext小部件提供给CoursulumSubject类。好的,我想我理解您的要求。您应该定义y我们的JTextArea是类变量,因此在一个表单对象中有一个它的实例,然后将文本附加到该对象中。方法示例:
public class CurriculumSubject extends JPanel implements ActionListener {
private JTextArea mainArea = new JTextArea();
public CurriculumSubject(final JReport frame) {
MigLayout layout = new MigLayout("wrap 2");//, debug 4000");
this.setLayout(layout);
final JTextField[] textfields = new JTextField[15];
JButton[] buttons = new JButton[15];
for (int i = 0; i < 15; i++) {
String content = "This is a test. " + i;
textfields[i] = new JTextField(content);
this.add(textfields[i], "width 500:700:1000");
buttons[i] = new JButton(">>>");
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Execute when button is pressed
String text = textfields[i].getText();
addTextToFinalArea(text);
}
});
buttons[i].setPreferredSize(new Dimension(10, 10));
this.add(buttons[i]);
}
}
public void addTextToFinalArea(String text) {
mainArea.append(text);
}
}
公共类课程主题扩展JPanel实现ActionListener{
私有JTextArea mainArea=新JTextArea();
公共课程科目(最终报告框架){
MigLayout布局=新的MigLayout(“包装2”);/,调试4000”);
这个.setLayout(布局);
最终JTextField[]textfields=新JTextField[15];
JButton[]按钮=新JButton[15];
对于(int i=0;i<15;i++){
String content=“这是一个测试。”+i;
textfields[i]=新的JTextField(内容);
添加(文本字段[i],“宽度500:700:1000”);
按钮[i]=新的JButton(“>>”);
按钮[i].addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
//按下按钮时执行
String text=textfields[i].getText();
addTextToFinalArea(文本);
}
});
按钮[i].setPreferredSize(新尺寸(10,10));
添加(按钮[i]);
}
}
公共无效addTextToFinalArea(字符串文本){
mainArea.append(文本);
}
}
我想知道编译器是否在抱怨您的代码:您在匿名内部ActionListener
实现中使用了非最终局部变量I
。请尝试将I
存储在最终变量中,并在内部类中使用该变量:
for (int i = 0; i < 15; i++) {
...
final int index = i;
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
//Execute when button is pressed
String text = textfields[index].getText();
frame.finaltext.append(text + "\n");
}});
...
}
for(int i=0;i<15;i++){
...
最终int指数=i;
按钮[i].addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
//按下按钮时执行
String text=textfields[index].getText();
frame.finaltext.append(text+“\n”);
}});
...
}
JReport是一个启动整个过程的类(包含名为finaltext的JTextArea)。图中显示了这里发生的情况——右侧区域位于JReport内,是一个JTextArea,选项卡位于选项卡窗格类中,每个选项卡窗格都是课程主题。如何访问JReport.finaltext(JTextArea)从课程实例来看?ThanksThanks-setter和getter似乎是合适的-我想我通过两种不同的方法来处理这个问题。然而,当我使用actionPerformed方法时,很难获得JReport的实例-但这并不是说其他方法无法获得它。这有意义吗?我会的看看MVC——几年前我对django做过一点工作,我对它很熟悉。再次感谢。我还得到了错误java.lang.ArrayIndexOutOfBoundsException——对于数组——每次我点击一个按钮,我是15,有15个元素0-14。如果我移动这个方法,我猜我将能够传递I的值。谢谢您的回答。唯一的问题是JReport中贴花了mainArea,而不是CoursulumSubject类。我已经在JReport框架中传递了JReport的实例,我真正想要访问的是frame.finaltext(这是一个JReport实例,有一个JTextArea实例)。在JReport类上执行相同的操作。在类变量列表中将JTextArea
声明为final
变量。然后在JReport类中创建一个方法:public void addTextToFinalArea(String text){mainArea.append(text);}
然后可以通过frame.addTextToFinalArea(text)获得文本区域;
谢谢-我正在看的另一个论坛建议这样做。getParent()。这个。getParent()并不总是有效。如果将面板放入另一个面板,则getParent()将返回JPanel元素,而不是JFrame。我会怎么做(尽管我不知道这是否是最佳解决方案)-我将为主窗口创建一个静态对象,并静态调用它JFrameClassName.staticInstanceObject
。
public class CurriculumSubject extends JPanel implements ActionListener {
private JTextArea mainArea = new JTextArea();
public CurriculumSubject(final JReport frame) {
MigLayout layout = new MigLayout("wrap 2");//, debug 4000");
this.setLayout(layout);
final JTextField[] textfields = new JTextField[15];
JButton[] buttons = new JButton[15];
for (int i = 0; i < 15; i++) {
String content = "This is a test. " + i;
textfields[i] = new JTextField(content);
this.add(textfields[i], "width 500:700:1000");
buttons[i] = new JButton(">>>");
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Execute when button is pressed
String text = textfields[i].getText();
addTextToFinalArea(text);
}
});
buttons[i].setPreferredSize(new Dimension(10, 10));
this.add(buttons[i]);
}
}
public void addTextToFinalArea(String text) {
mainArea.append(text);
}
}
for (int i = 0; i < 15; i++) {
...
final int index = i;
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
//Execute when button is pressed
String text = textfields[index].getText();
frame.finaltext.append(text + "\n");
}});
...
}