java - 如何正确地将 JPanel 放置到 JFrame 上?

标签 java swing jframe actionlistener jlabel

我目前正在 Uni 学习软件工程,我正在努力了解如何将 JPanel 正确添加到 JFrame 上。我的 JPanel 有几个按钮和一个 JLabel,它通过单击其中一个按钮并使用 ActionListener 进行更改。

我知道有几种方法可以做到这一点,这是我一直在尝试的方法,但我终究无法弄清楚!

我知道我做错了,但这是什么?

这是我的代码:

UIPanelOne:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;


public class UIPanelOne extends JPanel implements ActionListener {

private JButton yes, no, cancel;
private JPanel panel;
private JLabel l1, l2;

UIPanelOne() {

    super();
    setVisible(true);

    //label dec
    panel = new JPanel();

    //buttons
    yes = new JButton("Yes");
    no = new JButton("No");
    cancel = new JButton("Cancel");

    //label dec
    l1 = new JLabel("Hello");

    //button dec
    panel.setLayout(new BorderLayout());
    panel.add(yes);
    panel.add(no);
    panel.add(cancel);
    panel.add(l1);

}

public void actionPerformed(ActionEvent e) {

    if (e.getSource() == yes) {

        l1.setText("OK then!");
    }else if (e.getSource() == no){

        l1.setText("Goodbye then!");


    }else if(e.getSource() == cancel){

        System.exit(0);
    }


}

public JComponent getGUI(){

    return panel;
}
}

用户界面框架:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class UIFrame extends JFrame{


//constructor
public UIFrame(){

    //layout
    super("Can I help you?");
    setSize(400,600);
    setLayout(new BorderLayout());
    setVisible(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    UIPanelOne hello = new UIPanelOne();

    getContentPane().add(hello.getGUI());
   }
}

UI 测试:

public class UITest {

public static void main(String[] args){

UIFrame frame = new UIFrame();
frame.pack();

}

}

我知道很多这可能是错误的,我是一个完全的业余爱好者,但我希望在一些帮助下变得更好!

最佳答案

由于您的 UIPanelOne 扩展了 JPanel 类,您可以在该面板上添加您的组件(无需创建新面板),创建一个新实例并将该实例传递给添加JFrame方法:

add(new UIPanelOne());

UIPanelOne hello = new UIPanelOne();
add(hello,BorderLayout.CENTER);

setContentPane(hello);

避免使用 swing 组件扩展你的类,除非你想为它们定义新方法(创建自定义组件)或者你不想覆盖它们的某些方法。

您不必为 JFrame 设置 BorderLayout,因为它是 JFrame 的默认布局(已设置)。

在添加组件后调用 JFramesetVisible 方法。

此外,请阅读 Concurrency in Swing

关于java - 如何正确地将 JPanel 放置到 JFrame 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250540/

相关文章:

Java Swing JPanel JPanel 内部 JScrollPane 大小调整

java - 在 Java 中重新缩放绘图 (JFrame)

java - Swing 计时器不工作(Java)

java - 如何为 JTextPane 指定与主 JFrame 不同的宽度?

java - 使用 'Collections.frequency' 获取给定一个值的实例计数

java - 是关联还是聚合?

java - 平面设计 Java Swing 外观和感觉

java - 在 Java 中创建子图像

java - android&/sqlite : cursor causes problems

java - <匿名按钮>不是抽象的