在下面的代码中,XPos不断更改值,而我的代码没有采取任何操作。
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);
}
}
因此,似乎XPos仅在初始化方法的持续时间内保留其值。没有其他地方可以设置XPos的值。真正让我困惑的是,无论我在初始化中将XPos设置为什么,它总是回复到25但是我已经搜索了我的所有代码,因为我错误地做了“XPos = 25”并且它根本就不存在我的代码......还有什么可以在这里工作?
编辑:
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;
}
}
答案 0 :(得分:4)
XPos
内引用的JTwinPreviewButtons
对该类是私有的。当您在XPos
内打印previewPanel.refresh()
时,您指的是一个完全不同的变量。
答案 1 :(得分:1)
问题是previewPanel正在从JTwinPreviewButtons(JTPB)调用方法。从previewPanel调用时,所有这些方法都会返回X(按钮数)25。原因是每次创建新的JTPB时都会调用recursiveRefresh方法。由于previewPanel只引用了顶级JTPB,因此每次创建新的JTPB时都会调用一个布局方法。那个顶层实际上没有任何对低层次JTPB的引用,因此recursiveRefresh不会递归地影响任何其他JTPB。
哇,这太疯狂了。