【发布时间】:2011-11-09 20:53:59
【问题描述】:
我有一个 ArrayList,需要从我的 GUI 的多个组件中读取和写入。我已经大大减少了代码量,试图在下面这个简洁的代码段中说明问题。
父框架可能有许多内部框架,每个内部框架都需要它自己的此 ArrayList 实例。但是,特定内部框架的所有子组件都需要访问此 ArrayList 的同一实例,以便在特定内部框架的一个真正的 ArrayList 中维护添加和删除。对于此示例,ArrayList 中的所有数据都需要在内存中。不过,我稍后会添加代码以在每次内存发生更改时更新持久性数据文件。
这是我的简化代码段。谁能告诉我如何更改此代码,以便它为我提供我寻求的读/写访问权限?此外,任何相关文章的链接将不胜感激。
ParentFrame.java:
package testGlobalArrayList;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Panel;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JTabbedPane;
import java.util.*;
public class ParentFrame extends JFrame{
private static final long serialVersionUID = 1L;
JLayeredPane desktop;
JInternalFrame internalFrame;
public ParentFrame() {
super("parent frame");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(600, 300));
Panel p = new Panel();
this.add(p, BorderLayout.SOUTH);
desktop = new JDesktopPane();
this.add(desktop, BorderLayout.CENTER);
this.pack();
this.setSize(new Dimension(600, 300));
this.setLocationRelativeTo(null);
final int DELTA = 40;
int offset = DELTA;
int ifWidth = 400;
int ifHeight = 200;
internalFrame = new JInternalFrame("internal frame", true, true, true, true);
internalFrame.setLocation(offset, offset);
offset += DELTA;
JTabbedPane jtp = createTabbedPane();
internalFrame.add(jtp);
// want to make this ArrayList read/write accessible to every GUI component below this level
ArrayList<Integer> myArrayList= new ArrayList<Integer>();
myArrayList.add(8);
myArrayList.add(6);
myArrayList.add(7);
desktop.add(internalFrame);
internalFrame.pack();
internalFrame.setSize(new Dimension(ifWidth,ifHeight));
internalFrame.setVisible(true);
}
private JTabbedPane createTabbedPane() {
JTabbedPane jtp = new JTabbedPane();
jtp.setMinimumSize(new Dimension(600,300));
createTab(jtp, "Tab1");
createTab(jtp, "Tab2");
return jtp;
}
private void createTab(JTabbedPane jtp, String s) {
if(s=="Tab1"){
TestGUI myTimeSeriesGUI = new TestGUI();
jtp.add(s,myTimeSeriesGUI);
}
else{jtp.add(s, new JLabel("TabbedPane " + s, JLabel.CENTER));}
}
public static void main(String args[]) {
ParentFrame myParentFrame = new ParentFrame();
myParentFrame.setVisible(true);
}
}
TestGUI.java:
package testGlobalArrayList;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.Box;
public class TestGUI extends JPanel{
TestGUI(){
Box verticalBox = Box.createVerticalBox();
verticalBox.add(new TestPanel());
verticalBox.add(new TestPanel());
verticalBox.add(new TestPanel());
this.add(verticalBox, BorderLayout.CENTER);
}
void anotherMethod(){
// want to be able to add or delete records to same ArrayList here
myArrayList.add(5);
myArrayList.add(3);
myArrayList.add(0);
myArrayList.add(9);
}
}
TestPanel.java:
package testGlobalArrayList;
import java.awt.Color;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
public class TestPanel extends JPanel {
public TestPanel (){
this.setBackground(getRandomColor());
this.setBorder( new EtchedBorder() );
this.setSize(150,20);
}
void anotherMethod(){
//want to be able to add or delete records from same ArrayList here
myArrayList.remove(1);
myArrayList.remove(2);
myArrayList.remove(3);
}
private static Color getRandomColor(){
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
return randomColor;
}
}
【问题讨论】:
-
不要if(s=="Tab1"),使用.equals()。
-
@HannoBinder +1 它只能在这里正常工作,因为字符串文字是被实习的