我正在使用swing创建一个更大的GUI,它将弹出不同的帧,这些帧将根据已按下的主帧按钮充当编辑器。这个项目昨天正在运行,今天我向没有触及任何现有代码的类添加了代码。在完成一些代码后我决定再次运行程序来仔细检查我是如何格式化第一个编辑窗口的,但是我不知道某些东西改变了代码的执行方式,现在在点击Sprite编辑器按钮时,弹出的面板是空白。这个面板只是视觉上是空白的,因为它有19个原始组件,因为我可以看到我的鼠标在文本框中更改为文本指针,调试语句显示它在调用getComponents()时有19个组件。 。我的代码结构目前有点大,但代码流是这样的。
类主面板呈现正常,按下按钮时调用此
if(e.getSource() == resourceButton)
{
Utils.windowFromPanel(new SpriteEditor(), "SpriteEditor");
}
这是一个看起来像这样的函数。
public static JFrame windowFromPanel(JPanel panel, String title)
{
JFrame newWindow = new JFrame(title);
newWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
newWindow.getContentPane().add( panel );
newWindow.pack();
newWindow.setVisible(true);
//returning it so we can control when it closes in other parts of the program
return newWindow;
}
返回是这样的,使用此函数的其他类可以在框架上调用dispose(),但在这种情况下,我希望允许尽可能多的编辑器按用户的需要打开。
SpriteEditor的构造函数调用它的父构造函数。
public EditorObject()
{
objectAsStrings = null;
displayPanel = null;
makeEditorPanel();
}
其中makeEditorPanel()是一个创建面板的抽象函数,因为EditorObject扩展了JPanel。这就是SpriteEditor的makeEditorPanel()看起来的样子(抱歉长度)。
public void makeEditorPanel()
{
setLayout( new GridBagLayout() );
GridBagConstraints c = new GridBagConstraints();
filePath = new String();
resourceName = new String();
spriteName = new String();
resourceField = new JTextField("Use . instead of slashes when typing in the path");
openResourceTable = new JButton("Open");
cropButton = new JButton("Select Cropping from picture");
previewButton = new JButton("Preview Sprite");
addSpriteButton = new JButton("Add Sprite");
addResourceButton = new JButton("Add Resource");
resourceNameField = new JTextField("Name");
xStartField = new JTextField("0");
yStartField = new JTextField("0");
widthField = new JTextField("0");
heightField = new JTextField("0");
spriteNameField = new JTextField("Name1");
displayPanel = new JPanel();
resourceField.addActionListener(this);
openResourceTable.addActionListener(this);
addResourceButton.addActionListener(this);
cropButton.addActionListener(this);
previewButton.addActionListener(this);
addSpriteButton.addActionListener(this);
xStartField.addActionListener(this);
yStartField.addActionListener(this);
widthField.addActionListener(this);
heightField.addActionListener(this);
resourceNameField.addActionListener(this);
spriteNameField.addActionListener(this);
//formating of each element in this panel
c.fill = GridBagConstraints.HORIZONTAL;
c.weighty = 0.0;
c.weightx = 0.5;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(10, 20, 10, 20);
c.anchor = GridBagConstraints.CENTER;
add(new JLabel("Resource Path"), c);
c.gridx = 1;
c.gridwidth = 2;
c.ipadx = 120;
add(resourceField, c);
c.gridx = 3;
c.gridwidth = 1;
c.ipadx = 0;
add(openResourceTable, c);
c.gridx = 0;
c.gridy = 1;
add(new JLabel("Resource Name"), c);
c.gridx = 1;
add(resourceNameField, c);
c.gridx = 2;
c.gridwidth = 2;
add(addResourceButton, c);
c.gridy = 2;
c.gridx = 1;
c.gridwidth = 2;
c.weighty = 1;
add(cropButton, c);
c.gridy = 3;
c.gridx = 0;
c.gridwidth = 1;
c.weighty = 0;
add(new JLabel("xStart pixel"), c);
c.gridx = 1;
add(xStartField, c);
c.gridx = 2;
add(new JLabel("ystart pixel"), c);
c.gridx = 3;
add(yStartField, c);
c.gridy = 4;
c.gridx = 0;
add(new JLabel("width in pixels"), c);
c.gridx = 1;
add(widthField, c);
c.gridx = 2;
add(new JLabel("height in pixels"), c);
c.gridx = 3;
add(heightField, c);
c.gridy = 5;
c.gridx = 1;
add(new JLabel("Sprite Name"), c);
c.gridx = 2;
add(spriteNameField, c);
c.gridy = 6;
c.gridx = 0;
c.insets = new Insets(5, 10, 5, 10);
c.gridwidth = 2;
add( previewButton, c );
c.gridx = 2;
add(addSpriteButton, c);
updateButtons();
addTextFieldListeners();
}
我做过的一些调试表明,即使我注释掉所有这些,只需要添加(新的JLabel(“测试”));仍然没有在新的JFrame中呈现。此外,当我跳过Utils函数并让我的main函数最初呈现SpriteEditor对象而不是主Panel时,会出现相同的行为。
即使在调用repaint()之后,此行为仍然存在;重新验证(); 我很有智慧,任何帮助都会非常感激。
修改
经过更多的谷歌搜索后发现问题来自于调用其他类中的精灵编辑器类中的访问器方法。出于某种原因,如果可以在代码的其他部分中更改字段,则eclipse不会呈现窗口。 https://www.eclipse.org/forums/index.php/t/627683/试图解释它,但我不完全理解。如果我发现原因,我会发布一个完整的答案。
TL DR:影响JTextFields之类的东西的Getter和Setter函数将阻止eclipse正确地重新发送它们。