如何在jFrame上使用关闭按钮创建自定义标题栏?

时间:2012-10-10 14:38:41

标签: swing jframe

我想为JFrame创建一个自定义标题栏。我可以使用

删除默认标题栏
JFrame.setUndecorated(true)

现在我需要使用关闭按钮为我的JFrame创建一个自定义标题栏吗?

4 个答案:

答案 0 :(得分:2)

如果没有这样做,我想我会这样做:

  1. 确实将JFrame设置为未修饰的
  2. 扩展JRootPane以添加其他字段titleBar
  3. 创建一个包含标题,关闭按钮等的TitleBar组件......
  4. LayoutManager上设置一个新JRootPane(查看JRootPane.RootLayout)并按照相应的顺序排列组件(首先是标题栏,然后是菜单栏下方,然后是内容窗格)
  5. RootPane
  6. 上设置一个扩展JFrame的实例

    也许有更好的方法。

答案 1 :(得分:0)

我不太清楚你想如何自定义关闭按钮,但这可能会指向正确的方向:How can I customize the title bar on JFrame?

编辑:这是一个关于自定义GUI的论坛的更新工作链接,以及一个用户在创建简单GUI时发布的代码:Here

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

答案 2 :(得分:0)

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

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);
      }
    });
  }
}

可能工作正常,但如果用户也想设置L&amp; F. 比如nimbus

答案 3 :(得分:0)

实际上有三种方法可以解决这个问题:

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