關於JFileChooser問題,如何只選擇並且只顯示文件夾


我在用JFileChooser的時候時這樣用的:
JFileChooser jfcWorkFolder = new JFileChooser("c:\xxx");
jfcWorkFolder.setDialogTitle("title");
jfcWorkFolder.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );
int iState = jfcWorkFolder.showDialog(this,"ok");
if( iState == JFileChooser.APPROVE_OPTION )
{
}
可是還有個問題,那就是:
還有兩個選項,就是對話框上的“文件名稱”和“文件類型”,由於我只顯示並且只選擇
文件夾,所以這兩個東西不太合適,如何處理呢?如果沒有其他辦法只好去掉,如何去掉?

15 个解决方案

#1


Let it be.

#2


沒人能解決嗎?

#3


JFileChooser jfcWorkFolder = new JFileChooser("c:\xxx");
jfcWorkFolder.setDialogTitle("title");
jfcWorkFolder.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );
JPanel cons =(JPanel)jfcWorkFolder.getComponent(2);
    for(int i =0; i < cons.getComponentCount(); i++) {
        if(!(cons.getComponent(i) instanceof JButton)) {
            cons.remove(i);
        }
    }
int iState = jfcWorkFolder.showDialog(this,"ok");
....

記得結貼喲,:)

#4


to yuanmeng163(今天我有空) :
為何不對呢?我打印了cons.getComponent(i),共有三個component,且全部是JPanel.
不過你的思路倒是不錯!

#5


我的那段代碼在我機器上是通過了的。
我詳細給你講一下吧:
JFileChooser總共是有三個JPanel組成,即:
1。第一個Panel就是最上面的包含查看Lable、路徑選擇ComboBox及圖標的Panel.
2。第二個Panel就是中間那個顯示目錄中內容的ScollPanel.
3。第三個Panel就是我們想要的,即包含有Button按鈕的Panel
因此首先我們用JPanel cons =(JPanel)jfcWorkFolder.getComponent(2);得到想要的JFileChooser的最下面的那個Panel.
你說的對,得到的這個Panel也有三個Panel組成,即:
1。包含有文件名Lable及當前選擇的文件名的文本框的Panel;
2。包含有文件類型Lable及文件類型ComboBox的Panel;
3。就是包含Button的Panel;
所以你也可以這樣做:
...
JPanel cons =(JPanel)jfcWorkFolder.getComponent(2);
cons.remove(cons.getComponent(0));
cons.remove(cons.getComponent(1));
...
這屬於硬編碼,最好還是做個循環,解析出Button。。。

#6


To yuanmeng163:
還是不對,我試了1.3.1和1.4.0_03都不行
1.3.1:彈出異常
1.4.1:把Ok和cancel給去掉了
另外:
你的代碼使不是應該改成:
for(int i =cons.getComponentCount()-1; i >=0 ; i--) 
{
       if(!(cons.getComponent(i) instanceof JButton))
       { 
 cons.remove(i);
}
}

我都試過了,就是不成!

#7


你的java的版本是多少,你在詳細看看你的代碼,能給我發一份詳細的嗎?
sunxiang@harbournetworks.com;
貼出來也行,多謝!

#8


我用的是JB8,自帶JDK1.4.1,上面的兩次都可以通過。
下面是我新改的,也能通過,你試一下:
import javax.swing.*;
import java.awt.event.*;
public class TestFileChooser extends JFrame {
    JButton btn = new JButton("show");

    public TestFileChooser() {
        super("Test FileChooser");

        this.getContentPane().add(btn);
        this.setContentPane(this.getContentPane());

        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                showFileChooserDlg();
            }
        });

        this.setBounds(300, 300, 350, 80);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.show();
    }

    public void showFileChooserDlg() {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        JPanel contianBtnPane = (JPanel)chooser.getComponent(2);
        onlyKeepBtn(contianBtnPane);
        chooser.showDialog(this, "OK");
    }

    public void onlyKeepBtn(JPanel panel) {
        int nNum = panel.getComponentCount();
        int nNum2 = 0;
        JPanel tempPane = null;
        for(int i = 0; i < nNum; i++) {
            if(panel.getComponent(i) instanceof JPanel) {
                tempPane = (JPanel)panel.getComponent(i);
                nNum2 = tempPane.getComponentCount();
                for(int j = 0; j < nNum2; j++) {
                    if (! (tempPane.getComponent(j) instanceof JButton)) {
                        tempPane.remove(j);
                        nNum2 = tempPane.getComponentCount();
                        if (nNum2 == 0) {
                            break;
                        } else {
                            j--;
                        }
                    }
                }
            }

        }
    }

    public static void main(String[] args) {
        new TestFileChooser();
    }
}

#9


你的程序單獨運行可以,但是加在我們的程序里面,然后打成jar包再運行就不行了,而且
最重要的是單獨運行和打成我們的包運行界面竟然不一樣,甚至最上面的工具欄的圖表都不一樣,而且還多出個類似下面的東西(在最左邊):
----------------
| My Docment |
|            |
|  我的電腦  |
|            |
|  網絡      |
|-------------

我用下列函數打印chooser:
public void test(Container c)
{
     System.out.println("c--->" + c.getClass().getName());
     System.out.println("count--->" + c.getComponentCount());
     for (int i=0; i<c.getComponentCount(); i++)
{
     test((Container)c.getComponent(i));
}
}

他們的打印結果也不一樣,不知道是不是setLookAndFeel的問題?
要不你留個聯系方式,我發給你看看哪兒不一樣?

#10


經過我的證明,確實是setLookAndFeel的問題。
當設置為javax.swing.plaf.metal.MetalLookAndFeel或單獨運行而不設置時,運行正常
當設置為com.sun.java.swing.plaf.windows.WindowsLookAndFeel時,無論如何運行,都不正常

可我們的程序確實是設置成com.sun.java.swing.plaf.windows.WindowsLookAndFeel的,我總不能再此處令設置成一種風格吧。

#11


呵~~ 昨天在家過節了。
嗯,你說的是個問題,今天有時間再看一下。

#12


已經解決了,不過不是把其他的東西去掉。因為如果去掉的話,ok和cancel按鈕排序很不規范;我把它換成JTextField了

#13


我把“文件名”和“文件類型”,換成“文件夾名”和“說明”,把JComboBox換成JTextField了

#14


我改了一下onlyKeepBtn(JPanel panel)方法,通過了,並且按鈕位置也改了。
public void onlyKeepBtn(JPanel panel) {
    String strLookAndFeelName = UIManager.getLookAndFeel().getName();
    if(strLookAndFeelName.equals("Windows")) {
        panel = (JPanel)panel.getComponent(2);
        JPanel innerPane = (JPanel)panel.getComponent(4);
        panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
        innerPane.setLayout(new FlowLayout());
    }
    panel.remove(0);
    panel.remove(1);
}

#15


呵呵,這個方法倒是挺有趣的。
學習一下。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com