从 Java Swing 中的另一个类访问 JPanel 变量
Posted
技术标签:
【中文标题】从 Java Swing 中的另一个类访问 JPanel 变量【英文标题】:Accesing a JPanel variable from another class in Java Swing 【发布时间】:2022-01-24 03:45:09 【问题描述】:我有两个类,JFrame 类和用于单个面板的类(我将使用 CardLayout)。我的面板类扩展了我的 JFrame 类,但我希望能够在 JFrame 类中访问我的面板,以便我可以从那里将它添加到 JFrame。 (稍后我将从不同的 CardLayout 类执行此操作,但现在我从 JFrame 类执行此操作)。
这是面板类:
import java.awt.Font;
import javax.swing.*;
import javax.swing.border.Border;
public class ECLoginPanel extends ECFrame
public JPanel LoginPanel;
public JButton login;
public JButton signup;
public ECLoginPanel()
Color darkblue = new Color(24, 40, 85);
Color lightblue = new Color(78, 159, 206);
Border emptyBorder = BorderFactory.createEmptyBorder();
login = new JButton("Login");
signup = new JButton("Signup");
LoginPanel.setBackground(darkblue);
LoginPanel.add(login);
LoginPanel.add(signup);
login.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
login.setBackground(lightblue);
login.setFocusPainted(false);
login.setBorder(emptyBorder);
signup.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
signup.setBackground(lightblue);
signup.setFocusPainted(false);
signup.setBorder(emptyBorder);
这是框架类:
import javax.swing.*;
public class ECFrame
JFrame frame;
public ECFrame()
frame = new JFrame("EasyChat v0.01");
frame.setSize(800,450);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
【问题讨论】:
frame.add(new ECLoginPanel());
有什么问题?
@MadProgrammer 当我在 JFrame 类中这样做时,.add 上出现错误,因为 ECLoginPanel 是一个类,而不是一个组件。当我只是做 frame.add(LoginPanel);我在 LoginPanel 上收到错误,因为它无法解析为变量。
将extends ECFrame
改为extends JPanel
,同时确保导入正确
@MadProgrammer 非常感谢,但它仍然无法正常工作,我遇到了同样的错误。
您的问题表明,您可能会从一些基本的 Swing 教程中受益,以了解 GUI 的构建方式以及支持其完成方式的逻辑。您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info
【参考方案1】:
您似乎需要将LoginPanel
添加到frame
。
您的ECLoginPanel
已经有一个frame
(因为它继承自ECFrame
)。
所以你只需调用frame.add(LoginPanel);
(假设你的两个类在同一个包中)作为ECLoginPanel
的构造函数的最后一行。
但是您将frame
设置为在ECFrame
的构造函数中可见(在ECLoginPanel
的构造函数之前调用),因此您还应该在添加LoginPanel
之后重新验证并重新绘制框架。
所以将ECLoginPanel
的代码替换为:
import java.awt.Font;
import javax.swing.*;
import javax.swing.border.Border;
public class ECLoginPanel extends ECFrame
public JPanel LoginPanel;
public JButton login;
public JButton signup;
public ECLoginPanel()
Color darkblue = new Color(24, 40, 85);
Color lightblue = new Color(78, 159, 206);
Border emptyBorder = BorderFactory.createEmptyBorder();
login = new JButton("Login");
signup = new JButton("Signup");
LoginPanel.setBackground(darkblue);
LoginPanel.add(login);
LoginPanel.add(signup);
login.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
login.setBackground(lightblue);
login.setFocusPainted(false);
login.setBorder(emptyBorder);
signup.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
signup.setBackground(lightblue);
signup.setFocusPainted(false);
signup.setBorder(emptyBorder);
//Added the following 3 lines...
frame.add(LoginPanel);
frame.revalidate();
frame.repaint();
...让我们知道它是否有效。
【讨论】:
谢谢,但是如果我想使用 CardLayout,因此需要在一个类中添加不同的面板,但不想在 CardLayout 类中构建 GUI,该怎么办? 然后将您的JFrame
创建代码移到CardLayout
面板的构造函数之外。不需要将frame
的初始化代码放入构造函数中(可以在对象/面板构建完成后放入)。
与原始问题无关,但是...我的按钮和所有其他 GUI 都没有显示,我只有一个空白面板。
请编辑您的问题以反映您当前的代码(以便我和/或其他人能够回答),或发布另一个问题。以上是关于从 Java Swing 中的另一个类访问 JPanel 变量的主要内容,如果未能解决你的问题,请参考以下文章