如何在另一个 class 中为来自外部化 JPanel 的框架设置标题?
How to set the title for a frame from a externalized JPanel in another class?
我有 2 个 class:MainClass.java
和 BasicDataPage.java
,而第一个 class 是一个 JFrame
和一个 CardLayout
和第二个 class 是一个只有标签的 JPanel
。
当我点击MainClass
中的按钮时,卡片显示JPanel BasicDataPage
的内容(在这个例子中只有1张卡片,在我的真实程序中还有更多)。
但我无法从 JPanel
:
中更改 window / 帧的标题
MainClass.setTitle("BasicDataPage");
不会工作,因为我不能静态引用 non-static 方法 setTitle()
.
我的第一个冲动是更改标题,当单击按钮时,但在我的实际应用程序中,我有另一个名为 Navigation.java
的 class,其中包含 [=55] 的侦听器=].所以怎么改标题也是一样的问题:
Buttonclick in MainClass -> Navigation gets active -> needs to talk to MainClass and change the title
或
Buttonclick in MainClass -> BasicDataPage gets active -> needs to talk to MainClass and change the title
.
那么如何将 JFrame
的标题从 JPanel
更改为另一个 class?
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");
}
}
如果两个 classes 不知道彼此的存在,你可以有一个控制器 class 它保持对两个 classes 的实例的引用。从那里,从面板获取 "title" 并将其传递给框架:
class Contorller(){
public static void main(String[] args){
MainClass mainClass = new MainClass():
BasicDataPage bdp = new BasicDataPage();
mainClass.setTitle(bdp.getTitle()); //Need a setter in BasicDataPage class
}
}
class BasicDataPage{
private JLabel lblTitle;
//constructors and initializations not shown
public String getTitle(){
return lblTitle.text();
}
}
如果您的 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又加了一个panel..等等。
如果你想获取顶级容器(即框架)的引用,你可以使用:
SwingUtilities.windowForComponent();
how you would call the setParentComponent()?
假设您有一个用于 JFrame 的 class 和一个用于 JPanel 的 class。我通常会避免将这些 class 中的任何一个作为主要项目 class。您可以使用另一个单独的 class 来驱动代码。
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 中的框架,并将包含所有组件的面板添加到框架中。
我有 2 个 class:MainClass.java
和 BasicDataPage.java
,而第一个 class 是一个 JFrame
和一个 CardLayout
和第二个 class 是一个只有标签的 JPanel
。
当我点击MainClass
中的按钮时,卡片显示JPanel BasicDataPage
的内容(在这个例子中只有1张卡片,在我的真实程序中还有更多)。
但我无法从 JPanel
:
MainClass.setTitle("BasicDataPage");
不会工作,因为我不能静态引用 non-static 方法 setTitle()
.
我的第一个冲动是更改标题,当单击按钮时,但在我的实际应用程序中,我有另一个名为 Navigation.java
的 class,其中包含 [=55] 的侦听器=].所以怎么改标题也是一样的问题:
Buttonclick in MainClass -> Navigation gets active -> needs to talk to MainClass and change the title
或
Buttonclick in MainClass -> BasicDataPage gets active -> needs to talk to MainClass and change the title
.
那么如何将 JFrame
的标题从 JPanel
更改为另一个 class?
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");
}
}
如果两个 classes 不知道彼此的存在,你可以有一个控制器 class 它保持对两个 classes 的实例的引用。从那里,从面板获取 "title" 并将其传递给框架:
class Contorller(){
public static void main(String[] args){
MainClass mainClass = new MainClass():
BasicDataPage bdp = new BasicDataPage();
mainClass.setTitle(bdp.getTitle()); //Need a setter in BasicDataPage class
}
}
class BasicDataPage{
private JLabel lblTitle;
//constructors and initializations not shown
public String getTitle(){
return lblTitle.text();
}
}
如果您的 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又加了一个panel..等等。
如果你想获取顶级容器(即框架)的引用,你可以使用:
SwingUtilities.windowForComponent();
how you would call the setParentComponent()?
假设您有一个用于 JFrame 的 class 和一个用于 JPanel 的 class。我通常会避免将这些 class 中的任何一个作为主要项目 class。您可以使用另一个单独的 class 来驱动代码。
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 中的框架,并将包含所有组件的面板添加到框架中。