从 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 变量的主要内容,如果未能解决你的问题,请参考以下文章

使用Swing时的Java方法 - 可以在同一个类中的另一个事件方法中调用event方法吗?

从java中的另一个类访问静态变量

如何从同一项目中的另一个类访问主类中的变量? [复制]

如何从 JavaFX 中的另一个控制器类访问 UI 元素?

将实体从库引用到 JPA 中的另一个库

由java中的另一个线程刷新GUI(swing)