2016-03-02 4 views
1

Я написал простую программу в Netbeans 8.1 (Java Version 1.8.0_65), где он берет список обнаруженных файлов и записывает их в jTextArea. Это отлично работает, за исключением случаев, когда в jTextArea имеется много строк, т. Е. Что-либо более 500 строк или больше, большой палец в полосе прокрутки исчезает. Я вижу точный вопрос, который описывает этот post.JScrollPane не показывает большой палец в Nimbus L & F, когда TextArea имеет много строк

Это, как представляется known issue с Nimbus L & F и люди выложили обходные пути для этого, как описано в посте выше, где они говорят, чтобы обойти эту проблему, просто добавьте строку:

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

вопрос У меня есть, где именно я помещаю эту строку кода? Я попытался добавить его в initComponents прямо перед созданием jScrollPanel (как показано ниже в моем коде). Я также попытался это сразу после заявления, если при проверке, если Nimbus доступен:

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

Я ясно только вращал о попытке вставить его в разных местах без понимания того, что я делаю, и что, ни к чему сюрприз, не работает.

Может кто-нибудь помочь мне определить, где должна идти эта обходная линия кода?

Мой код:

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"); 
     }  
    } 
} 
+0

* * Вместо этого используйте 'JList'. Также см. Графический интерфейс [File Browser GUI] (http://codereview.stackexchange.com/q/4446/7784) для файлового браузера, который может предоставить некоторые советы (например, хорошие рендеринги). –

+0

Спасибо. Я установил висящую закрытую скобку и также посмотрю на использование jlist. – Monty

+0

Возможно, вам потребуется проверить различия между вашим ключом 'Scrollbar.minimumThumbSize' и' ScrollBar.minimumThumbSize'. – aterai

ответ

1

Вот другой подход: ".. она принимает список обнаруженных файлов и записывает их в JTextArea"

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); 
    }); 
    } 
} 
+0

Спасибо! Это решило мою проблему. В Netbeans я добавил 4 строки кода, которые вы указали в коде Pre-Init для JScrollPane, так как это защищенный код netbeans. После этого работает как чемпион. – Monty

Смежные вопросы