2

我想为我的JFrame. 我可以删除默认标题栏

JFrame.setUndecorated(true)

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

4

4 回答 4

3

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

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

也许有更好的方法。

于 2012-10-10T14:54:53.530 回答
0

我不太确定您想如何自定义关闭按钮,但也许这可以为您指明正确的方向:如何自定义 JFrame 上的标题栏?

编辑:这是一个关于自定义 GUI 的论坛的更新工作链接,一位用户发布了关于他创建简单 GUI 的代码:这里

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

于 2012-10-10T14:46:46.433 回答
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&F,如 nimbus

于 2014-08-18T17:36:30.070 回答
0

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

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