我有2个JFrame用于具有多个窗口的游戏。 1 JFrame是主要的,而另一个仅供参考。是否可以更新非活动信息jframe而无需单击非活动窗口?我对这种能力一无所知。附:我不想只使用纯Java的库。如果库是TINY那么我可以使用它。
答案 0 :(得分:4)
您的问题实际上与Windows和JFrame关系不大,而且与对象之间的通信问题有很多关系。如果要更改对象的状态,可以调用其中一个方法。对于“JFrames”也可以这样做,通过使用活动代码,无论是什么或任何地方,调用其他“非活动”显示组件对象的方法,从而改变它们的显示。通常问题变成当调用方法时,并且使用事件驱动的GUI,这通常意味着使用一种或另一种观察者模式。
如果我的回答看起来有点模糊和笼统,那么鉴于目前提供的信息,我担心这是我能做的最好的。如果您需要更具体的帮助,请考虑发布相关代码,以及有关整体问题和程序结构的更多信息。
此外,阅读The Use of Multiple JFrames, Good/Bad Practice?作为您的整体GUI设计及其多个JFrame,而常见的新手程序设计可能会让用户烦恼。以其他方式显示多个视图可能更好。
答案 1 :(得分:1)
有可能,基本上一个JFrame必须引用另一个。你说你的一个JFrame是主要的,另一个是信息。我们的想法是拥有一个成员变量,该变量将作为对其他JFrame(或您的案例中的JPanel)的引用。然后,您可以使用该引用来更新它(也许重新绘制它)。当然,另一种解决方案是拥有一个单独的类,它引用了所有JFrame / JPanel,因此可以访问它们。请注意,您还可以使用requestFocusInWindow()将焦点设置为JFrame。
这是一个示例代码,向您展示原则。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main
{
public static void main(String[] args)
{
JFrame childFrame = new JFrame("Child Frame");
JPanel childPanel = new JPanel();
childFrame.setSize(300, 200);
childFrame.add(childPanel);
MainFrame mainFrame = new MainFrame(childPanel);
mainFrame.setVisible(true);
childFrame.setVisible(true);
}
}
class MainFrame extends JFrame
{
private JPanel childPanel;
public MainFrame(JPanel childPanel)
{
super();
this.childPanel = childPanel;
setSize(300,200);
setTitle("Main Frame");
actOnChild();
}
public void actOnChild()
{
// Do something...
childPanel.add(new JLabel("I was updated with something!"));
}
}
输出:
您将看到子(info)JFrame的面板将包含JLabel,我们通过第一个JFrame的方法添加了JLabel,有效地更新了第一个JFrame中的第二个JFrame。这可以从具有该引用的任何其他类中获得。