Java Swing组件在JButton事件后重新格式化

Java Swing组件在JButton事件后重新格式化,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,这是我在这里的第一篇文章,所以请原谅我做了一些格式错误,并告诉我如何做 我对GridBagLayout的编码有点陌生,所以我已经理解了它的基本概念。有时,格式会完全消失 应该是这样的,一个漂亮的大文本窗格: 有时,TP非常小: 触发此问题的唯一方法是从JButton调用窗口。 我粘贴了代码以在多个位置调用窗口(Error.showDialog(new Exception());),似乎只要有ActionListener调用它,就会发生这种情况 这是我打印错误消息的对话框 publicstat

这是我在这里的第一篇文章,所以请原谅我做了一些格式错误,并告诉我如何做

我对GridBagLayout的编码有点陌生,所以我已经理解了它的基本概念。有时,格式会完全消失

应该是这样的,一个漂亮的大文本窗格:

有时,TP非常小:

触发此问题的唯一方法是从JButton调用窗口。 我粘贴了代码以在多个位置调用窗口(
Error.showDialog(new Exception());
),似乎只要有ActionListener调用它,就会发生这种情况

这是我打印错误消息的对话框

publicstaticvoidshowDialog(异常myException){
ByteArrayOutputStream os=新建ByteArrayOutputStream();
PrintStream ps=新的PrintStream(os);
myException.printStackTrace(ps);
试一试{
ErrorString=os.toString(“UTF8”);
}捕获(不支持DencodingException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
JFrame窗口=新JFrame(“错误”);
设置窗口大小(550600);
window.setLocationRelativeTo(空);
window.setresizeable(false);
window.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE);
JPanel panel=newjpanel(newgridbagloayout());
GridBagConstraints c=新的GridBagConstraints();
c、 插图=新插图(5,5,5,5);
c、 fill=GridBagConstraints.BOTH;
c、 gridy=0;
tpError=newjtextpane();
tpError.setPreferredSize(新尺寸(500500));
tpError.setEditable(false);
tpError.setText(ErrorString);
JScrollPane scrollPane=新的JScrollPane(tpError,JScrollPane.VERTICAL\u SCROLLBAR\u根据需要,
JScrollPane.水平滚动条(根据需要);
panel.add(滚动窗格,c);
c、 gridy++;
JPanel panelBtns=新的JPanel(新的FlowLayout());
JButton btnClose=新的JButton(“Schließen”);
btnClose.addActionListener(新的ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
window.setVisible(false);
window.dispose();
}
});
panelBtns.add(btnClose);
JButton btnSend=新JButton(“Bericht”);
addActionListener(新的ActionListener(){
@凌驾
已执行的公共无效行动(行动事件AE){
试一试{
Desktop.getDesktop().browse(新URI(“mailto:my。name@mail.de?主题=Fehler%20im%20Converter”);
}catch(IOException | URISyntaxException ex){
例如printStackTrace();
}
}
});
panelBtns.add(btnSend);
面板。添加(面板BTN,c);
窗口。添加(面板);
window.setVisible(true);
window.repaint();
}
如图所示,格式有时会重置。我以前多次遇到过这个问题,但我只是忽略了它。这一次,它做我想做的事情很重要

tpError.setPreferredSize(new Dimension(500, 500));
不要硬编码首选尺寸

使用GridBagLayout时,当没有足够的空间以首选尺寸显示组件时,组件将以其“最小尺寸”显示。相反,您需要使用其他约束(如“填充”约束)来控制零部件随着可用空间的变化而增长/收缩的方式

但是,更好的解决方案是不使用GridBagLayout。相反,只需使用帧的默认布局,即
边框布局
。那么基本代码是:

JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane( textPane );
add(scrollPane, BorderLayout.CENTER);

add(panelButtons, BorderLayout.PAGE_END);

当您不必担心更复杂的约束时,操作会简单得多。

您忘记了为文本窗格设置weightx和weighty属性

    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(5, 5, 5, 5);
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 1; // set weightx/y
    c.weighty = 1;

    c.gridy = 0;
    JTextPane tpError = new JTextPane();
    tpError.setEditable(false);
    try {
        tpError.setText(os.toString("UTF8"));
    } catch (Exception e) {
        e.printStackTrace();
    }

    JScrollPane scrollPane = new JScrollPane(tpError, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    panel.add(scrollPane, c);

    c.gridy++;
    c.weightx = 0; // clean weightx/y
    c.weighty = 0;
    JPanel panelBtns = new JPanel(new FlowLayout());
另一种可能是将首选大小设置为滚动窗格(而不是JTextPane)


我将布局更改为BorderLayout,效果很好。
    JTextPane tpError = new JTextPane();
    tpError.setEditable(false);
    try {
        tpError.setText(os.toString("UTF8"));
    } catch (Exception e) {
        e.printStackTrace();
    }

    JScrollPane scrollPane = new JScrollPane(tpError, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setPreferredSize(new Dimension(500, 500));
    panel.add(scrollPane, c);