问题描述
UIManager.put("OptionPane.messageFont",new FontUIResource(new Font("Serif",Font.PLAIN,25)));
但是当我将文本的大小设置得太大时,我无法调整对话框的大小。当我在屏幕上有太多文本时,这就会成为一个问题,导致我的 GUI 在垂直方向上比我的屏幕大,这最终使我无法按下顶部的“x”按钮,或者我按下的任何按钮有在屏幕的底部。我希望能够拖动来调整我的 GUI 的大小,以及里面文本的大小。这是可能的吗?如果没有,我如何创建可调整大小的 GUI?
解决方法
也许通过在显示对话框之前添加一个侦听器,它会在添加到对话框以及对话框可见时被调用。 借助 Windows 类
self.solve()
如果你想使用 None
方法,我们需要将它类型转换为 dialog
self.solve()
这是一种可以将组件包装在滚动窗格中的方法
None
,
人们往往会忘记 JOptionPane
不仅仅是显示文本。将组件作为 message
参数传递将直接在结果对话框中显示该组件。
下面是一个稍微简化的例子。它从嵌入的文本文件(自带)加载文本,在本例中,该文件是从 https://imsdb.com/scripts/Star-Wars-A-New-Hope.html 复制的 New Hope 脚本并显示它。
import java.awt.EventQueue;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JTextArea ta = new JTextArea(25,50);
ta.setFont(new Font("Serif",Font.PLAIN,25));
String text = "";
try (BufferedReader br = new BufferedReader(new InputStreamReader(Test.class.getResourceAsStream("Script.txt")))) {
String line = null;
StringBuilder buffer = new StringBuilder(1024);
while ((line = br.readLine()) != null) {
buffer.append(line).append("\n");
}
text = buffer.toString();
} catch (IOException ex) {
ex.printStackTrace();
}
ta.setText(text);
ta.setCaretPosition(0);
JOptionPane.showMessageDialog(null,new JScrollPane(ta));
}
});
}
}
此处要注意的重要部分是行 JTextArea ta = new JTextArea(25,50);
。这将设置文本区域的“首选滚动大小”,JScrollPane
将使用它来确定它需要多少空间。
尝试从 JTextArea
构造函数中删除参数并查看结果以进行比较。
现在,将会有一些限制,您将必须找到方法来平衡您的愿望与您拥有的硬件(屏幕)不动产的物理可能性。
您也可以使用 JFrame
执行相同的操作,因此将调用 JOptionPane
替换为类似...
JFrame frame = new JFrame();
frame.add(new JScrollPane(ta));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
会给你一个类似的结果。在这两种情况下,窗口都可以调整大小。
您可能会在计算目标屏幕的可用可视空间和所需的窗口大小时遇到很多麻烦,并进行大量捏造,但在大多数情况下,您只需要考虑一下自己的情况在您面临的一些限制范围内做和工作。