gpt4 book ai didi

java - 如何从另一个类中的外部化 JPanel 设置框架的标题?

转载 作者:行者123 更新时间:2023-11-30 07:32:28 27 4
gpt4 key购买 nike

我有 2 个类:MainClass.javaBasicDataPage.java,而第一个类是带有 CardLayout 的 JFrame 第二个类是一个只有标签的 JPanel

当我单击 MainClass 中的按钮时,卡片显示 JPanel BasicDataPage 的内容(在本例中只有 1 张卡片,在我的真实程序中)还有好几个)。

但我无法从 JPanel 内部更改窗口/框架的标题:

MainClass.setTitle("BasicDataPage"); 不起作用,因为我无法对非静态方法 setTitle() 进行静态引用。

我的第一个冲动是在单击按钮时更改标题,但在我的实际应用程序中,我有另一个名为 Navigation.java 的类,其中包含导航按钮的监听器。所以如何更改标题也是同样的问题:

单击 MainClass 中的按钮 -> 导航激活 -> 需要与 MainClass 对话并更改标题

或者

单击 MainClass 中的按钮 -> BasicDataPage 激活 -> 需要与 MainClass 通信并更改标题

那么如何从另一个类中的 JPanel 更改 JFrame 的标题?

MainClass.java:

import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;

public class MainClass extends JFrame{
public CardLayout contentCardsLayout = new CardLayout();

BasicDataPage basicDataPage = new BasicDataPage();

JButton changePageButton = new JButton("Goto BasicDataPage");

public MainClass(){
super("My MainClass");
setBounds(300, 50, 400, 400);
setLayout(contentCardsLayout);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

changePageButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
contentCardsLayout.show(getContentPane(), "basicDataPage");
}
});

basicDataPage.setName("basicDataPage");

add(changePageButton);
add(basicDataPage, "basicDataPage");
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

MainClass window = new MainClass();
window.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

}

BasicDataPage.java:

import javax.swing.JLabel;
import javax.swing.JPanel;

public class BasicDataPage extends JPanel {

public BasicDataPage() {
add(new JLabel("MainClass - BasicDataPage"));
// This does not work, since I can not make a static reference to the non-static method setTitle()
// MainClass.setTitle("BasicDataPage");
}
}

最佳答案

如果您的 JPanel 已添加到 JFrame 中,也就是说您的 BasicDataPage 已添加到您的 MainClass 中。

在这种关系下,您可以使用getParent()轻松地从添加的组件中获取父容器:

示例:

class BasicDataPage extends JPanel{
//constructors and initializations not shown..

public void setPrentComponent(){
Object o = getParent();
MainClass mc;
if(o != null && o instanceof MainClass)
mc = (MainClass)o;

mc.setTitle(lbl.getText());
}
}

如果你想获得顶级容器。例如,一个 JFrame 添加了一个 MainPanel,而 MainPanel 添加了另一个面板..等等。

如果您想获取顶级容器(即框架)的引用,您可以使用:

SwingUtilities.windowForComponent();
<小时/>

how you would call the setParentComponent()?

假设您有一个 JFrame 类和一个 JPanel 类。我通常不会将这些类中的任何一个作为主要项目类。您可以使用另一个单独的类来驱动代码。

class TestRunner{
public static void main(String[] args){
MainClass mc = new MainClass(); //I will rename this class if I were you
BasicDataPage bdp = new BasicDataPage();
mc.add(bdp); //add panel to frame;
bdp.setParentComponent(); //Set parent container
}
}

这来自您所拥有的,通常我不会创建自定义的 JFrame,而是在 EDT 中运行该框架并将包含所有组件的面板添加到该框架中。

关于java - 如何从另一个类中的外部化 JPanel 设置框架的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35889156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com