我想为我的JFrame
. 我可以删除默认标题栏
JFrame.setUndecorated(true)
现在我需要JFrame
用关闭按钮为我创建一个自定义的标题栏吗?
如果没有这样做过,我想我会这样:
JFrame
为未装饰JRootPane
以添加附加字段titleBar
TitleBar
包含标题、关闭按钮等的组件...LayoutManager
的JRootPane
(看看JRootPane.RootLayout
)并以适当的顺序布局组件(首先是标题栏,然后是菜单栏下方,然后是内容窗格下方)RootPane
在您的上设置一个扩展的实例JFrame
也许有更好的方法。
我不太确定您想如何自定义关闭按钮,但也许这可以为您指明正确的方向:如何自定义 JFrame 上的标题栏?
编辑:这是一个关于自定义 GUI 的论坛的更新工作链接,一位用户发布了关于他创建简单 GUI 的代码:这里
看起来您可以修改他的 removeComponents 方法并创建一个 addComponents 方法来满足您的需求。
根据上述链接的代码:(为 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