我正在尝试删除JFrame顶部的拖动条。我想保持最小化最大化和关闭此栏上显示的选项。我想的是删除栏(和图标)。然后将图标添加为实现JFrame actionlistener的嵌入图像。它也有必要与JInternalFrames一起使用。任何帮助将不胜感激。
答案 0 :(得分:4)
您需要退一步了解Swing的工作原理。
创建JFrame时,Swing使用OS小部件作为框架。您看到的标题栏是OS组件的一部分,您无法使用Swing直接控制它。您可以使用之前建议的setUndecorated(false)隐藏框架的标题栏(和边框)。在这种情况下,您将失去与标题栏相关的所有功能(拖动和访问所有按钮)和边框(调整大小)。因此,如果您需要任何此功能,则需要自己重新创建。
另一方面,您可以使用:
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
并且Swing将为您构建标题栏和边框,并添加所有默认功能。因此,如果要阻止拖动,现在需要检查JFrame的所有组件,以找到代表标题栏的组件。找到此组件后,可以从组件中删除MouseMotionListeners以防止拖动。这样标题栏仍然在那里,按钮将处于活动状态,但拖动将被禁用。我猜想将所有功能添加到未修饰的框架中会更容易。
正如您已经意识到JInternalFrame是一个完全用Swing编写的组件,因此您可以访问子组件,这实际上也是我为JFrame建议的方法。
答案 1 :(得分:1)
要删除标题栏,请使用
setUndecorated(true);
然后,您可以重新添加按钮以最大化/最小化。最大化按钮的来源可能看起来像那样(只是为了得到一个想法)。使用JFrame.ICONIFIED
最小化按钮。
JButton btnMaximize = new JButton("+");
btnMaximize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(MainFrame.this.getExtendedState() == JFrame.MAXIMIZED_BOTH) {
MainFrame.this.setExtendedState(JFrame.NORMAL);
}
else {
MainFrame.this.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
}
});
答案 2 :(得分:1)
看看这篇文章 - 我认为它几乎是你对JFrame部分的需求。
http://www.stupidjavatricks.com/?p=4
它基于JDialog,但它应该与JFrame几乎相同。最大化/最小化应该与关闭按钮几乎相同。
答案 3 :(得分:-1)
对于JInternalFrames ......
javax.swing.plaf.InternalFrameUI ifu= this.getUI();
((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);