Java 变量丢失存储值
在下面的代码中,XPos不断地更改值,而我的代码不会对其采取任何操作Java 变量丢失存储值,java,variables,Java,Variables,在下面的代码中,XPos不断地更改值,而我的代码不会对其采取任何操作 public class JTwinPreviewButtons { static PreviewPanel previewPanel; static EditorPanel editorPanel; ArrayList<JTwinPreviewButtons> subButtons = new ArrayList<JTwinPreviewButtons>(); priv
public class JTwinPreviewButtons {
static PreviewPanel previewPanel;
static EditorPanel editorPanel;
ArrayList<JTwinPreviewButtons> subButtons = new ArrayList<JTwinPreviewButtons>();
private static int overallYPos = 0;
Item item;
JButton plusButton;
JButton itemButton;
private boolean isPlus;
private boolean shown;
private int YPos;
private int XPos;
public JTwinPreviewButtons(Item someItem, int itemNum) {
plusButton = new JButton("-");
itemButton = new JButton(someItem.getName());
item = someItem;
isPlus = false;
shown = true;
System.out.println("Item Number: "+itemNum);
XPos = (itemNum * 15) + 25;
System.out.println(XPos); //XPos == 70
if (previewPanel!=null) {
if (itemNum == 0) {
previewPanel.addTopButton(this);
}
previewPanel.refresh(); //printed inside here XPos == 25
System.out.println(XPos); //XPos == 70
}
plusButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isPlus) {
for (JTwinPreviewButtons subs : subButtons) {
subs.setSubShown(true);
}
plusButton.setText("-");
isPlus = false;
previewPanel.refresh();
} else {
for (JTwinPreviewButtons subs : subButtons) {
subs.setSubShown(false);
}
plusButton.setText("+");
isPlus = true;
previewPanel.refresh();
}
}
});
itemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
//here XPos == 70
//after initialization method XPos == 25
}
}
private void updateYPos() {
YPos = overallYPos;
overallYPos += 25;
}
private void setBounds() {
updateYPos();
System.out.println(XPos); //25
plusButton.setBounds(XPos-20, YPos+2, 16, 16);
itemButton.setBounds(XPos, YPos, itemButton.getText().length()*7+15, 20);
}
public void display() {
if (shown) {
System.out.println(XPos); //25
setBounds();
previewPanel.add(plusButton);
previewPanel.add(itemButton);
}
}
公共类JTwinPreviewButtons{
静态预览面板预览面板;
静态EditorPanel EditorPanel;
ArrayList子按钮=新建ArrayList();
私有静态int-overallYPos=0;
项目;
JButton plusButton;
JButton项目按钮;
私有布尔isPlus;
显示私有布尔值;
私营机构;
私人int XPO;
公共JTwinPreviewButtons(Item someItem,int itemNum){
plusButton=新的JButton(“-”);
itemButton=newjbutton(someItem.getName());
item=someItem;
isPlus=false;
显示=正确;
System.out.println(“项目编号:+itemNum”);
XPos=(itemNum*15)+25;
System.out.println(XPos);//XPos==70
如果(previewPanel!=null){
如果(itemNum==0){
previewPanel.addTopButton(此按钮);
}
previewPanel.refresh();//在此处打印XPos==25
System.out.println(XPos);//XPos==70
}
plusButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(isPlus){
用于(JTwinPreviewButtons子按钮:子按钮){
subs.setSubShown(真);
}
plusButton.setText(“-”);
isPlus=false;
previewPanel.refresh();
}否则{
用于(JTwinPreviewButtons子按钮:子按钮){
subs.setSubShown(假);
}
plusButton.setText(“+”);
isPlus=true;
previewPanel.refresh();
}
}
});
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
//这里XPos==70
//初始化方法XPos==25后
}
}
私有void updateYPos(){
YPos=总体YPos;
总的来说,POS+=25;
}
私人证券交易所(){
updateYPos();
System.out.println(XPos);//25
加钮扣.立根(XPos-20,YPos+2,16,16);
itemButton.setBounds(XPos、YPos、itemButton.getText().length()*7+15,20);
}
公共空间显示(){
如图所示{
System.out.println(XPos);//25
挫折();
previewPanel.add(plusButton);
previewPanel.add(项目按钮);
}
}
因此,XPos似乎只在初始化方法期间保留其值。没有其他地方可以设置XPos的值。真正让我困惑的是,无论我在初始化时将XPos设置为什么,它总是恢复为25,但我已经搜索了我所有的代码,寻找我错误地执行“XPos=25”的任何其他位置,它根本不存在于我的代码中。。。这里还能有什么工作
编辑:
导入java.awt.Component;
导入java.awt.Dimension;
导入java.util.ArrayList;
导入javax.swing.JPanel;
公共类预览面板{
ArrayList topButtons=新建ArrayList();
JPanel面板=新JPanel(空);
公共预览面板(){
面板。设置首选尺寸(新尺寸(600750));
刷新();
}
公共无效addTopButton(JTwinPreviewButtons按钮){
添加(按钮);
}
公共无效添加(组件组件组件){
面板。添加(comp);
}
公共无效刷新(){
panel.removeAll();
recursiveRefresh(顶部按钮);
}
私有void recursiveRefresh(ArrayList列表){
用于(JTwinPreviewButtons o:list){
o、 显示();
recursiveRefresh(o.getSubButtons());
}
}
公共JPanel getComponent(){
返回面板;
}
}
在JTwinPreviewButtons
中引用的XPO
对该类是私有的。当您在previewPanel.refresh()
内部打印XPos
时,您引用的是一个完全不同的变量。问题是previewPanel正在从JTwinPreviewButtons(JTPB)调用方法。当从previewPanel调用所有这些方法时,将返回X(按钮数)25。原因是每次创建新的JTPB时都会调用recursiveRefresh方法。因为previewPanel只引用顶级JTPB,所以每次创建新的JTPB时,它都会调用自己的布局方法。上面的一个实际上没有任何对较低层次结构JTPBs的引用,因此recursiveRefresh不会递归地影响任何其他JTPBs
哇哦,那太疯狂了。初始化XPos=25后你是什么意思?调用构造函数后,您在哪里检查xpos
的值?xpos=(itemNum*15)+25代码>…您是否使用itemNum==0
创建对象?Jim Garrisson的回答几乎肯定是正确的,但我们能否查看previewPanel的代码以确保添加到@RichardTingle的注释中,查看初始化后的打印位置也会有所帮助。这要感谢RichardTingle、SamIam,尤其是crush。请给我一秒钟时间在回答中说明问题所在。我不会在previewPanel.refresh()中打印它。previewPanel有一个对所有JTwinPreviewButtons的引用,当我设置一个虚拟方法(在JTwinPreviewButtons内部)来打印它们的XPO时,它们都打印25。另外,这也不能解释为什么初始化后调用了任何方法(我可以在其中嵌套System.out.print)print 25。另外,我在问这个问题之前也尝试过公开这个问题,因为这是我对罪犯的第一次怀疑。但是,这导致了相同的结果(25)。如果你不显示相关代码,你希望如何得到有意义的答案?更新^I我试图发布它,但是有太多代码和太多评论需要回复。我不指望有人能神奇地知道这个秘密
import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JPanel;
public class PreviewPanel {
ArrayList<JTwinPreviewButtons> topButtons = new ArrayList<JTwinPreviewButtons>();
JPanel panel = new JPanel(null);
public PreviewPanel() {
panel.setPreferredSize(new Dimension(600,750));
refresh();
}
public void addTopButton(JTwinPreviewButtons button) {
topButtons.add(button);
}
public void add(Component comp) {
panel.add(comp);
}
public void refresh() {
panel.removeAll();
recursiveRefresh(topButtons);
}
private void recursiveRefresh(ArrayList<JTwinPreviewButtons> list) {
for (JTwinPreviewButtons o : list) {
o.display();
recursiveRefresh(o.getSubButtons());
}
}
public JPanel getComponent() {
return panel;
}
}