更新未激活JPanel上的非活动JFrame

问题描述:

我有2多个窗口的游戏JFrames。 1 JFrame是主要的,而另一个只是为了获取信息。是否可以更新不活动信息jframe而无需点击非活动窗口?我对这种能力一无所知。附:我不想使用库只是纯java。如果库是TINY,那么我可以使用它。更新未激活JPanel上的非活动JFrame

+1

从UX的角度来看,我会建议你有一个多视图的JFrame。也就是说,我会执行观察者模式或事件总线。在我看来,事件公交车更容易实施和维护。 – dazito 2014-10-19 06:13:09

您的问题实际上与Windows和JFrames有关,而且与对象之间的通信问题有关。如果你想改变一个对象的状态,你可以调用它的一个方法。对于你的“JFrames”也是一样,通过让活动代码(无论在哪里或是在哪里)调用其他“非活动”显示组件对象的方法,从而改变它们的显示。通常这个问题变成之一,当调用一个方法时,以及事件驱动的GUI,这通常意味着使用一种或另一种观察者模式。

如果我的回答看起来有点模糊和一般,恐怕这是我能做的最好的,因为目前所提供的信息。如果您需要更具体的帮助,请考虑发布相关代码以及有关您的整体问题和程序结构的更多信息。

此外,阅读有关The Use of Multiple JFrames, Good/Bad Practice?作为您的整体GUI设计与其多个JFrames,而一个常见的新手程序设计,可能会对用户恼人。以其他方式显示多个视图可能会更好。

有可能,基本上一个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!")); } }

输出:

enter image description here

你会看到孩子(信息)Jframe的面板将包含一个JLabel,这是我们通过第一JFrame的一个方法添加,从第一个JFrame有效更新第二个JFrame。这是可能的任何其他类具有该参考。