2013-06-14 41 views
7

Tôi muốn các văn bản trong lĩnh vực tên file của JFileChooser lưu hộp thoại để chọn chỉ tên tập tin và không phải là mở rộng.Làm một JFileChooser chọn văn bản của tên tập tin nhưng không phải là mở rộng

Tôi hiện có này:

What it currently looks like

Và muốn nó trông như thế này:

Ideally what it'd look like

Đây là một sự thay đổi đơn giản, nhưng một trong đó làm cho lưu một file dễ dàng hơn nhiều theo ý kiến ​​của tôi, vì người dùng có thể bắt đầu nhập tên tệp ngay lập tức mà không xóa phần mở rộng vô tình.

Tôi biết tôi một cách mạnh mẽ có thể thêm phần mở rộng nếu nó mất tích, nhưng tôi không muốn làm điều này vì phần mở rộng là không bắt buộc và tôi không cảm thấy nó nên được thi hành.

Vì vậy, có cách nào tôi có thể đạt được điều này?

+0

Tôi không biết câu trả lời nhưng nó là một câu hỏi hay, tôi sẽ xem xét xem những gì tôi có thể tìm thấy. –

Trả lời

2

API không cung cấp trực tiếp nhưng một cách đơn giản để thực hiện là quét cấu trúc phân cấp thành phần, tìm kiếm JTextField và sau đó thay đổi lựa chọn của trường văn bản đó.

Dưới đây là một ví dụ về giải pháp mà:

import java.awt.Component; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class TestJFileChooser { 

    public TestJFileChooser() { 

    } 

    protected void initUI() { 
     JFrame frame = new JFrame(TestJFileChooser.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JButton button = new JButton("Click me"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JFileChooser chooser = new JFileChooser(); 
       chooser.setSelectedFile(new File(chooser.getCurrentDirectory(), "save.dat")); 
       final JTextField textField = getTexField(chooser); 
       if (textField != null) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          String text = textField.getText(); 
          if (text != null) { 
           int index = text.lastIndexOf('.'); 
           if (index > -1) { 
            textField.setSelectionStart(0); 
            textField.setSelectionEnd(index); 
           } 
          } 
         } 
        }); 
       } 
       chooser.showSaveDialog(button); 
      } 

      private JTextField getTexField(Container container) { 
       for (int i = 0; i < container.getComponentCount(); i++) { 
        Component child = container.getComponent(i); 
        if (child instanceof JTextField) { 
         return (JTextField) child; 
        } else if (child instanceof Container) { 
         JTextField field = getTexField((Container) child); 
         if (field != null) { 
          return field; 
         } 
        } 
       } 
       return null; 
      } 
     }); 
     frame.add(button); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestJFileChooser fc = new TestJFileChooser(); 
       fc.initUI(); 
      } 
     }); 
    } 
} 
+0

Một chút nặng hơn tôi đã hy vọng, nhưng nó hoạt động như một say mê. Cảm ơn! – Kat

0

có vẻ như nó không thể cấu hình này trên các thành phần mặc định,

tôi đoán bạn sẽ phải mở rộng nó, hướng dẫn này sẽ giúp bạn:

https://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html

+0

Vui lòng tránh đăng [Câu trả lời chỉ dành cho liên kết] (http://meta.stackexchange.com/a/95691/186314). Điều này không phải là rất hữu ích và liên kết của bạn có thể bị hỏng tại một số điểm, mất tất cả các thông tin có liên quan. –

0

Tôi tin rằng bạn có thể viết một JFileChooser tùy chỉnh bằng cách mở rộng com.sun.java.swing.plaf.windows.WindowsFileChooserUI và ghi đè phương pháp setFileName() của nó.

+0

Nhưng người dùng có vẻ là trên Linux (từ L & F của ảnh chụp màn hình của mình). Dù sao, đó không phải là di động cả. Tôi sẽ không đi xuống con đường đó. –

+0

@GuillaumePolet Có bạn đã đúng. Nó không di động và sẽ chỉ hữu ích nếu trên hệ điều hành Windows. – Mubin

Các vấn đề liên quan