在窗口外部显示ComboBox菜单时发生Swing Render Bug

问题描述

我不确定这是仅在我的机器上发生还是在什么地方发生,但是该错误似乎很有趣,因此我将其发布在此处以查看是否有人遇到它。如果有人愿意找出原因或对其进行测试,那就太好了。

顺便说一句,类似的问题here。可能是相同的错误,但不太确定。尽管那似乎发生在Nvidia上,但我正在使用AMD。 (虽然它是相同的错误,但是会在6年后仍然存在,这将是非常有趣的。)

请注意,我正在使用JDK 15.0.1。

错误解释

我在NetBeans中创建的一个简单的Swing应用程序:

enter image description here

这个很好用:

enter image description here

单击底部的组合框后呈现错误。然后该错误仅停留在光标所在的位置,因为它会导致重新绘制。如果我调整大小,最小化或将窗口移到任务栏下方并备份,则可以修复该问题:

enter image description here

但是,如果未修复该错误关闭了该窗口,则该错误会永远永远保留在同一应用程序中的其他打开的窗口中,并且无法修复。 (至少从我尝试过的情况来看。)

在构建我自己的应用程序时遇到此错误。有一些业余时间,所以我花了一些时间看看是什么触发了它。

触发条件

  1. 需要在应用程序底部具有一个组合框,以便菜单位于窗口之外。
  2. 需要在窗口中显示一个textArea。在删除textArea之后,该错误消失了。 (它可能需要像示例中那样放在一边。尚未测试它的布局是否重要)。 (它也可能与scrollPane有关,还没有对其进行测试。)

我测试过的东西

  1. 主题无关紧要,因此,如果您使用“ Windows”或“ Nimbus”运行它,该错误仍然存​​在。
  2. 父级无关紧要,仍然可以通过直接调用它或从另一个jframe调用它来实现。
  3. 它也发生在jdialog上。
  4. [编辑] 在有和没有可运行事件队列的情况下进行了测试。

代码

您可以复制并粘贴下面的代码,或者直接在NetBeans上下载并运行该项目。 (我使用的是12.1版):https://drive.google.com/file/d/1PyrQ4IVYe5xDfXiXSip0rifxPbatKKcT/view

package javaapplication1;

public class JavaApplication1 {

    public static void main(String[] args){
        try 
        {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) 
            {
                if ("Windows".equals(info.getName())) 
                {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } 
        catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);} 
        catch (InstantiationException ex) {java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE,ex);} 
        catch (illegalaccessexception ex) {java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE,ex);} 
        catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE,ex);}
        
        NewJFrame frame = new NewJFrame();
        java.awt.EventQueue.invokelater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
        
    }
}
package javaapplication1;

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel8 = new javax.swing.JPanel();
        jPanel7 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(50,0),new java.awt.Dimension(50,300));
        jButton2 = new javax.swing.JButton();
        filler20 = new javax.swing.Box.Filler(new java.awt.Dimension(50,300));
        jComboBox2 = new javax.swing.JComboBox<>();
        filler5 = new javax.swing.Box.Filler(new java.awt.Dimension(50,300));
        filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0,new java.awt.Dimension(0,32767));
        jPanel1 = new javax.swing.JPanel();
        filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(50,300));
        jButton1 = new javax.swing.JButton();
        filler19 = new javax.swing.Box.Filler(new java.awt.Dimension(50,300));
        jComboBox1 = new javax.swing.JComboBox<>();
        filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(50,300));
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setDefaultCloSEOperation(javax.swing.WindowConstants.disPOSE_ON_CLOSE);
        setTitle("Test");
        setPreferredSize(new java.awt.Dimension(550,400));
        getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(),javax.swing.BoxLayout.LINE_AXIS));

        jPanel8.setLayout(new javax.swing.BoxLayout(jPanel8,javax.swing.BoxLayout.X_AXIS));

        jPanel7.setLayout(new javax.swing.BoxLayout(jPanel7,javax.swing.BoxLayout.Y_AXIS));

        jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2,javax.swing.BoxLayout.X_AXIS));
        jPanel2.add(filler3);

        jButton2.setText("jButton1");
        jButton2.setAlignmentX(0.5F);
        jPanel2.add(jButton2);
        jPanel2.add(filler20);

        jComboBox2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1","Item 2","Item 3","Item 4","Item 5","Item 6","Item 7" }));
        jComboBox2.setMaximumSize(new java.awt.Dimension(32767,20));
        jPanel2.add(jComboBox2);
        jPanel2.add(filler5);

        jPanel7.add(jPanel2);
        jPanel7.add(filler4);

        jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1,javax.swing.BoxLayout.X_AXIS));
        jPanel1.add(filler2);

        jButton1.setText("jButton1");
        jPanel1.add(jButton1);
        jPanel1.add(filler19);

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1","Item 7" }));
        jComboBox1.setMaximumSize(new java.awt.Dimension(32767,20));
        jPanel1.add(jComboBox1);
        jPanel1.add(filler1);

        jPanel7.add(jPanel1);

        jPanel8.add(jPanel7);

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jPanel8.add(jScrollPane1);

        getContentPane().add(jPanel8);

        pack();
        setLocationRelativeto(null);
    }// </editor-fold>                        


    // Variables declaration - do not modify                     
    private javax.swing.Box.Filler filler1;
    private javax.swing.Box.Filler filler19;
    private javax.swing.Box.Filler filler2;
    private javax.swing.Box.Filler filler20;
    private javax.swing.Box.Filler filler3;
    private javax.swing.Box.Filler filler4;
    private javax.swing.Box.Filler filler5;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JComboBox<String> jComboBox1;
    private javax.swing.JComboBox<String> jComboBox2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel8;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration                   
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)