更新未激活JPanel上的非活动JFrame
我有2多个窗口的游戏JFrames。 1 JFrame是主要的,而另一个只是为了获取信息。是否可以更新不活动信息jframe而无需点击非活动窗口?我对这种能力一无所知。附:我不想使用库只是纯java。如果库是TINY,那么我可以使用它。更新未激活JPanel上的非活动JFrame
您的问题实际上与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!"));
}
}
输出:
你会看到孩子(信息)Jframe的面板将包含一个JLabel,这是我们通过第一JFrame的一个方法添加,从第一个JFrame有效更新第二个JFrame。这是可能的任何其他类具有该参考。
从UX的角度来看,我会建议你有一个多视图的JFrame。也就是说,我会执行观察者模式或事件总线。在我看来,事件公交车更容易实施和维护。 – dazito 2014-10-19 06:13:09