- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果有人将其标记为重复,我会自己做:我们很久以前就有一个非常相关的问题:
Java setResizable(false) changes the window size (swing)
没有一个解决方案适合我。这是我的 SSCCE:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
public class TitleHeightChange extends JFrame {
private static final String lp = System.lineSeparator();
public TitleHeightChange() {
begin();
}
private void begin() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// UIManager.installLookAndFeel("Nimbus", NimbusLookAndFeel.class.getName());
JFrame frame1 = new JFrame();
frame1.setTitle("Frame1");
frame1.setLayout(new BorderLayout());
JTextArea area1 = new JTextArea();
area1.setBorder(BorderFactory.createLineBorder(Color.darkGray,1));
frame1.add(area1, BorderLayout.CENTER);
frame1.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
area1.setText("frame height: " + frame1.getBounds().height + lp
+ "frame width: " + frame1.getBounds().width + lp
+ "content pane height: " + frame1.getContentPane().getBounds().height + lp
+ "content pane width: " + frame1.getContentPane().getBounds().width + lp
+ "title bar height: " + (frame1.getBounds().height-frame1.getContentPane().getBounds().height) + lp
+ "isResizable() value: false");
}
@Override
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
frame1.setResizable(false);
frame1.pack();
frame1.setBounds(0, 0, 300, 300);
frame1.setLocationRelativeTo(null);
frame1.setVisible(true);
JFrame frame2 = new JFrame();
frame2.setTitle("Frame2");
frame2.setLayout(new BorderLayout());
JTextArea area2 = new JTextArea();
area2.setBorder(BorderFactory.createLineBorder(Color.darkGray,1));
frame2.add(area2, BorderLayout.CENTER);
frame2.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
area2.setText("frame height: " + frame2.getBounds().height + lp
+ "frame width: " + frame2.getBounds().width + lp
+ "content pane height: " + frame2.getContentPane().getBounds().height + lp
+ "content pane width: " + frame2.getContentPane().getBounds().width + lp
+ "title bar height: " + (frame2.getBounds().height-frame2.getContentPane().getBounds().height) + lp
+ "isResizable() value: true");
}
@Override
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
frame2.setResizable(true);
frame2.pack();
frame2.setBounds(0, 0, 300, 300);
frame2.setLocationRelativeTo(null);
frame2.setVisible(false);
setLayout(new BorderLayout());
JButton b = new JButton();
b.setText("switch");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (frame1.isVisible()) {
frame1.setVisible(false);
frame2.setVisible(true);
} else {
frame1.setVisible(true);
frame2.setVisible(false);
}
}
});
b.setBounds(0, 0, 100, 30);
add(b, BorderLayout.CENTER);
pack();
setBounds(600, 700, 100, 30);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TitleHeightChange frame = new TitleHeightChange();
}
});
}
}
我注意到不仅窗口的大小发生了变化,标题栏的高度也发生了变化。用这个 GIF 可以更好地说明这一点:
我们可以在这个例子中看到我们需要的所有数据。当框架不可调整大小时:
frame height: 300
frame width: 300
content pane height: 274
content pane width: 294
title bar height: 26
isResizable() value: false
当框架大小可调时:
frame height: 300
frame width: 300
content pane height: 264
content pane width: 284
title bar height: 36
isResizable() value: true
因此,当框架设置为不可调整大小时,其内容 Pane 将添加 (5, 5, 5, 5) 的插图,并且为了保持 JFrame 的总大小,标题栏会缩小 10 像素???这是荒谬的。
我已经在使用和不使用 Nimbus L&F 的情况下进行了测试,这无关紧要。
这怎么可能并且可以容忍?
我找到的解决方案是,当我们在 pack()
之后 setBounds()
时,在可调整大小的窗口处添加 10 个像素。但这很难看,而且不妨碍标题栏增大。
我们如何解决这个问题?
最佳答案
毕竟是外观问题……
如果我们使用Java默认的Metal外观,并在创建两个框架之前设置setDefaultLookAndFeelDecolated(true)
,则Java默认外观风格的边框/插图将被绘制并可见,因此两个JFrame具有相同的宽度和高度。
我玩过其他 L&F,发现 javax.swing.plaf.nimbus.NimbusLookAndFeel
、com.sun.java.swing.plaf.windows.WindowsLookAndFeel
和 com.sun.java.swing.plaf.motif.MotifLookAndFeel
尚未实现这个额外的拖动处理程序,可能是出于美观原因。 (我真的很怀疑为什么Java默认样式想要绘制这个处理程序。我个人认为这并不是不可预见的。我认为实现其他L&F的人也想避免它,所以他们想出了一个可用但丑陋的解决方案。)
关于java - Swing - setResizable(true) 使 JFrame 标题栏更高,窗口尺寸更小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44303746/
package data; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; publ
我使用 netbeans 作为 IDE。我如何在 JFrame 上设置 setResizable(false)。我在 netbeans 中看不到 JFrame 的对象。 最佳答案 只需在类的非静态方法
您好,我正在处理项目中基于 swing 的 gui 部分,我需要将 setBounds JFrame 的方法与 setResizable 调用同步,所以我这样做: setResizable(t
这个问题已经有答案了: JFrame not presenting any Components (4 个回答) 已关闭 6 年前。 我正在努力提高我的 java 技能(自从我编码以来已经有大约 10
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我制作游戏已经有一段时间了。最近我遇到一个错误,说 "Exception in thread "main" java.lang.Error: Unresolved compilation probl
我有一个奇怪的问题。我正在为窗口使用空布局(= JFrame 和在窗口上),如果我使用 setResizable (false),窗口大小会变大(向右和底部,我会说大约 10 像素)。我不知道为什么。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。请参阅SSCCE.o
为什么这个程序不起作用? (它不打印“正在运行...”) package eu.inmensia.learn; import java.awt.Canvas; import java.awt.Dime
此代码由 Netbean 6.8 GUI 生成器自动生成。默认应用程序不包含在 jFrame 中!它仅在 jPanel 中,我不知道如何使其无法重新调整大小。所以我添加了一个 jFrame 来包含所有
这个小型 JavaFX 测试应用程序 import javafx.application.Application; import javafx.scene.Scene; import javafx.s
我有一个简单的 Atari 突破程序,长话短说,我的一个功能是允许用户调整窗口大小几秒钟,然后再次使窗口不可调整大小。一切正常,窗口从不可调整大小变为可调整大小几秒钟。应该发生的情况是,几秒钟后,窗口
如果有人将其标记为重复,我会自己做:我们很久以前就有一个非常相关的问题: Java setResizable(false) changes the window size (swing) 没有一个解决
我刚刚读过这个答案 https://stackoverflow.com/a/15560624/3211987但是如果我添加 for 循环,第一个 JFrame 的大小就可以了,但其他 JFrame 的
当我查看 Frame.setResizable 的文档时,我读到: Sets whether this frame is resizable by the user. 所以我知道我仍然可以调用它的 s
我是一名优秀的程序员,十分优秀!