简体   繁体   English

TextArea有很多行时,JScrollPane在Nimbus L&F中不显示拇指

[英]JScrollPane doesn't show thumb in Nimbus L&F when TextArea has many lines

I've written a simple program in Netbeans 8.1 (Java Version 1.8.0_65), where it takes a list of discovered files and writes them to a jTextArea. 我已经在Netbeans 8.1(Java版本1.8.0_65)中编写了一个简单的程序,其中包含已发现文件的列表并将其写入jTextArea。 This works fine, except when there are many lines written to the jTextArea (ie anything over 500 lines or so), the thumb in the scrollbar disappears. 这样做很好,除非有很多行写入jTextArea(即超过500行左右的行),滚动条中的拇指消失。 I'm seeing the exact issue that this post describes. 我看到了这篇文章描述的确切问题。

This appears to be a known issue with Nimbus L&F and folks have posted workarounds for this as described in the post above where they say to workaround this issue to just add the line: 这似乎是Nimbus L&F的一个已知问题 ,并且人们已经按照上面的帖子中所述发布了针对此问题的变通方法,他们说要变通解决此问题,只需添加以下行:

UIManager.getLookAndFeelDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));

The issue I am having is where exactly do I put this line of code? 我遇到的问题是我应该将这行代码放在哪里? I've tried adding it to the initComponents right before the jScrollPanel is created (as seen below in my code). 我已经尝试在创建jScrollPanel之前将其添加到initComponents中(如下面的代码所示)。 I've also tried it right after the if statement when checking if Nimbus is available: 在检查Nimbus是否可用时,我还在if语句之后尝试了它:

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }

I'm clearly just flailing about trying to stick it different places without understanding what I'm doing and that, to no surprise, is not working. 我显然只是在试图将其粘贴在不同的地方而没有理解我在做什么,这很奇怪,不足为奇,这是行不通的。

Can someone help me determine where this workaround line of code should go? 有人可以帮助我确定此替代方法行应该去哪里吗?

My Code: 我的代码:

    public class ViewFiles extends javax.swing.JFrame {

    /**
     * Creates new form ViewFiles
     */
    public ViewFiles() {
        initComponents();

    }

    public ViewFiles(ArrayList<DiscoveredFile> files){
        initComponents();
        discoveredFiles = files;
        displayFiles();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        javax.swing.UIManager.getLookAndFeelDefaults().put("Scrollbar.minimumThumbSize", new Dimension(30,30));
        jScrollPane1 = new javax.swing.JScrollPane();
        viewFilesTextArea = new javax.swing.JTextArea();
        viewFilesCloseButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

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

        viewFilesCloseButton.setText("Close");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 656, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(viewFilesCloseButton)
                .addGap(29, 29, 29))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(viewFilesCloseButton)
                .addContainerGap())
        );

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

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }

        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ViewFiles.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ViewFiles.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ViewFiles.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ViewFiles.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ViewFiles().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton viewFilesCloseButton;
    private javax.swing.JTextArea viewFilesTextArea;
    // End of variables declaration                   
    private ArrayList<DiscoveredFile> discoveredFiles;

    public void displayFiles() {
        for (DiscoveredFile file : discoveredFiles){
            viewFilesTextArea.append(file.getFullPath() + "\n");
        }    
    }
}

Here is another approach: 这是另一种方法:

UIDefaults def = new UIDefaults();
def.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
jScrollPane1 = new JScrollPane();
jScrollPane1.getVerticalScrollBar().putClientProperty("Nimbus.Overrides", def);
import java.awt.*;
import java.util.*;
import javax.swing.*;

public class ViewFiles2 extends JFrame {
  private JScrollPane jScrollPane1;
  private JButton viewFilesCloseButton;
  private JTextArea viewFilesTextArea;
  public ViewFiles2() {
    initComponents();
    displayFiles();
  }
  private void initComponents() {
      //NG?: UIManager.getLookAndFeelDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
      //OK?: UIManager.getDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));

    jScrollPane1 = new JScrollPane();

    UIDefaults def = new UIDefaults();
    def.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
    jScrollPane1.getVerticalScrollBar().putClientProperty("Nimbus.Overrides", def);

    viewFilesTextArea = new JTextArea(20, 5);
    viewFilesCloseButton = new JButton("Close");
    jScrollPane1.setViewportView(viewFilesTextArea);

    GroupLayout layout = new GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
      layout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 656, Short.MAX_VALUE)
                .addContainerGap())
      .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(viewFilesCloseButton)
                .addGap(29, 29, 29))
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(viewFilesCloseButton)
                .addContainerGap())
    );

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    pack();
  }
  public void displayFiles() {
    viewFilesTextArea.setText(String.join("\n", Collections.nCopies(500, "aaaaaaaaaaaaa")));
  }
  public static void main(String[] args) {
    try {
      for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
          UIManager.setLookAndFeel(info.getClassName());
          break;
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    //OK?: UIManager.getLookAndFeelDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
    //NG?: UIManager.getDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));

    EventQueue.invokeLater(() -> {
      new ViewFiles2().setVisible(true);
    });
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM