在非活动JFrame上更新非活动JPanel

时间:2014-10-19 05:05:39

标签: java swing jframe multiple-instances

我有2个JFrame用于具有多个窗口的游戏。 1 JFrame是主要的,而另一个仅供参考。是否可以更新非活动信息jframe而无需单击非活动窗口?我对这种能力一无所知。附:我不想只使用纯Java的库。如果库是TINY那么我可以使用它。

2 个答案:

答案 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!")); } }

输出:

enter image description here

您将看到子(info)JFrame的面板将包含JLabel,我们通过第一个JFrame的方法添加了JLabel,有效地更新了第一个JFrame中的第二个JFrame。这可以从具有该引用的任何其他类中获得。