Swing 如何在jFrame上创建带有关闭按钮的自定义标题栏?

Swing 如何在jFrame上创建带有关闭按钮的自定义标题栏?,swing,jframe,Swing,Jframe,我想为我的JFrame创建一个自定义标题栏。我可以使用删除默认标题栏 JFrame.setUndecorated(true) 现在,我需要为我的JFrame创建一个带有关闭按钮的自定义标题栏?我不太确定您希望如何自定义关闭按钮,但这可能会为您指明正确的方向: 编辑:这里有一个更新的工作链接,指向一个关于定制GUI的论坛,一位用户在创建简单GUI时发布了代码: 看起来您可以修改他的removeComponents方法并创建一个addComponents方法来满足您的需要 如果不这样做,我想我会这

我想为我的
JFrame
创建一个自定义标题栏。我可以使用删除默认标题栏

JFrame.setUndecorated(true)

现在,我需要为我的
JFrame
创建一个带有关闭按钮的自定义标题栏?

我不太确定您希望如何自定义关闭按钮,但这可能会为您指明正确的方向:

编辑:这里有一个更新的工作链接,指向一个关于定制GUI的论坛,一位用户在创建简单GUI时发布了代码:


看起来您可以修改他的removeComponents方法并创建一个addComponents方法来满足您的需要

如果不这样做,我想我会这样做:

  • 确实,将
    JFrame
    设置为未装饰
  • 扩展
    JRootPane
    以添加附加字段
    titleBar
  • 创建一个包含标题、关闭按钮等的
    标题栏
    组件
  • JRootPane
    上设置一个新的
    LayoutManager
    (查看
    JRootPane.RootLayout
    ),并按适当的顺序布局组件(首先是标题栏,然后是菜单栏下方,然后是内容窗格下方)
  • JFrame

  • 也许有更好的办法

    根据上述链接的代码: (为Java 8编辑)

    import javax.swing.*;
    导入java.awt.*;
    导入java.awt.event.*;
    导入java.util.logging.Level;
    导入java.util.logging.Logger;
    类测试{
    public void buildGUI()引发不受支持的LookandFeelException{
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame f=新的JFrame();
    f、 可设置大小(假);
    移除MinMaxClose(f);
    JPanel p=newjpanel(newgridbaglayout());
    JButton btn=新JButton(“退出”);
    p、 添加(btn,新GridBagConstraints());
    f、 getContentPane().add(p);
    f、 设置大小(400300);
    f、 setLocationRelativeTo(空);
    f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f、 setVisible(真);
    btn.addActionListener((ActionEvent ae)->{
    系统出口(0);
    });
    }
    公共无效删除MinMaxClose(组件组件组件){
    if(comp instanceof AbstractButton){
    comp.getParent().remove(comp);
    }
    if(容器的组件实例){
    组件[]comps=((容器)comp.getComponents();
    对于(int x=0,y=comps.length;x{
    试一试{
    新测试().buildGUI();
    }捕获(无支持的LookandFeelexception ex){
    Logger.getLogger(Testing.class.getName()).log(Level.SEVERE,null,ex);
    }
    });
    }
    }
    
    可能工作正常,但如果用户还想设置L&F呢
    例如nimbus,实际上有三种方法:

  • 将框架设置为未装饰,并实现所有功能,包括控制按钮、捕捉、调整大小和移动
  • 获取JFrame的根窗格并直接编辑该窗格。您需要添加控制按钮和捕捉行为
  • 使用JNI在创建JFrame时获取窗口句柄,以获得对其属性的控制。这在本文中得到了更好的解释。我还构建了一个基本上是JFrame类的扩展的小程序,它处理所有需要处理的事情。。。最后一种方法不会破坏本机功能,如捕捉和调整大小。但是,如果您想从头开始构建控件,您确实需要再次创建控件按钮,因为您有一个新的标题栏

  • 是的,但这些问题的答案是指其他不再有效的链接。请发布直接工作链接或删除此帖子
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    class Testing {
      public void buildGUI() throws UnsupportedLookAndFeelException {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame f = new JFrame();
        f.setResizable(false);
        removeMinMaxClose(f);
        JPanel p = new JPanel(new GridBagLayout());
        JButton btn = new JButton("Exit");
        p.add(btn, new GridBagConstraints());
        f.getContentPane().add(p);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        btn.addActionListener((ActionEvent ae) -> {
          System.exit(0);
        });
      }
    
      public void removeMinMaxClose(Component comp) {
        if (comp instanceof AbstractButton) {
          comp.getParent().remove(comp);
        }
        if (comp instanceof Container) {
          Component[] comps = ((Container) comp).getComponents();
          for (int x = 0, y = comps.length; x < y; x++) {
            removeMinMaxClose(comps[x]);
          }
        }
      }
    
      public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
          try {
            new Testing().buildGUI();
          } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Testing.class.getName()).log(Level.SEVERE, null, ex);
          }
        });
      }
    }