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,实际上有三种方法:
是的,但这些问题的答案是指其他不再有效的链接。请发布直接工作链接或删除此帖子
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);
}
});
}
}