我想从JFrame中仅删除最小化按钮 但是想在JFrame标题栏中使用最大化和关闭按钮。
我在谈论删除不禁用。
答案 0 :(得分:4)
我不认为删除最小化按钮是一件好事。但您可以使用setUndecorated()方法删除标题栏和窗口边缘。而且你必须添加自己的关闭和最大化按钮来执行这些操作。
以下是一个例子:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
public class Example {
public Example() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);//<---- this will disable the frame decorations
JPanel panel = new JPanel();
panel.add(new JLabel("titlebar"));
//Add button maximize
JButton button_max=new JButton("Maximize");
button_max.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if(frame.getExtendedState() == JFrame.NORMAL) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
} else {
frame.setExtendedState(JFrame.NORMAL);
}
}
});
panel.add(button_max);
//Add button close
JButton button_close = new JButton(new AbstractAction("Close") {
private static final long serialVersionUID = -4901571960357967734L;
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
panel.add(button_close);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
new Example();
}
}
修改:
正如@peeskillet在评论中所说的那样,即使使用这种方法,窗口仍然可以被用户调整大小和拖动。 ComponentResizer 类允许这样做。
这是一个SO post,它提供了一个将此类与Jframe
一起使用的好例子。
答案 1 :(得分:1)
这是一个非常大的黑客攻击,只适用于Synthetica L&F,因为它提供了一个绘制的标题栏。注意:此L&amp; F不能免费使用。因此,如果您使用它,您必须获得许可。
当您使用此L&amp; F时,您可以从根窗格开始迭代所有组件以查找SyntheticaTitlePane
的实例。成功后,您可以尝试使用Reflection Framework访问字段iconifyAction
,并在其上使用Action.setEnabled(false)
方法。
我不知道如何访问标准标题栏,因为它是原生的。可能这是不可能的。