还是JFileChooser的问题,高手,你在那里,在那里,在那里。。。

时间:2022-04-14 12:13:15
1。文件选取器中,选择全部文件显示(注意不是单指某一种文件),发现文件都没有图标。怎么设置系统默认图标

2。文件选取器中,表示用的LIST BUTTON不能押下,为什么?

9 个解决方案

#1


拿本Swing的书翻一下就知道了。如果是在windows下面用的话,可以用java.awt.FileDialog  跟windows的打开对话框完全一样,估计是调用windows的API,不能跨平台

#2


其实问题就在这里,由于AWT组件是一种对等组件,由于自身的缺点,在多平台上可能会出现问题。所以才有了SWING组件。我想,JFILECHOOSER本身不能读取文件图标可能就是跨平台做出的一种牺牲。但我想,有没有什么方法,能让JFILECHOOSER读取本地的文件系统,从而能够显示默认图标。

我想问,大家以前在做项目时,有没有类似的现象,如果有,是怎么解决的。如果没有解决,那客户允许这样的文件选取器吗?

#3


再说一句,我觉得java.awt.FileDialog 是可以跨平台的,只不过是AWT的对等组件的体系结构在绘制窗口时调用的是本地的用户界面组件。而不是在容器中自己绘制。不过,这样的话,在多个平台上是窗体否能表现一致就很值得怀疑。不过,我仅仅用的是FILEDIALGO。所以,FILEDIALOG是否在多平台上没有问题,就需要高手们来解答了。

#4


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
public class ZipTest extends JFrame implements ActionListener
{
private JComboBox fileList=new JComboBox();
private JTextArea fileText=new JTextArea();
private JScrollPane pane;
private JMenuItem openItem,exitItem;
private String zipname;
public ZipTest()
{
setTitle("ZipTest");
setSize(300,400);
        
         addWindowListener(new WindowAdapter()
{
 public void windowClosing(WindowEvent e)
{
 System.exit(0);
 }
});

JMenuBar mbar=new JMenuBar();
JMenu m=new JMenu("File");
m.setMnemonic('F');
openItem=new JMenuItem("Open",'O');
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
openItem.addActionListener(this);
m.add(openItem);
exitItem=new JMenuItem("eXit",'X');
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
exitItem.addActionListener(this);
m.add(exitItem);
mbar.add(m);

fileList.addActionListener(this);

Container c=getContentPane();
c.add(mbar,"North");
c.add(fileList,"South");
//////////////////////////////////////////////////////////////////
        fileText.setEditable(false);//设置为只读属性 
pane=new JScrollPane(fileText);//使textarea可以有滚动条
c.add(pane,"Center");
///////////////////////////////////////////////////////////////////////
//c.add(fileText,"Center");
       //show();
}
public void actionPerformed(ActionEvent evt)
{
Object source=evt.getSource();
if(source==openItem)
{
JFileChooser chooser=new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileFilter(new FileFilter()
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith(".zip")||f.isDirectory();
}
public String getDescription()
{
return "ZIP FILES";
}
});
int r=chooser.showOpenDialog(this);
if(r==JFileChooser.APPROVE_OPTION)
{
zipname=chooser.getSelectedFile().getPath();
scanZipFile();
}
}
else if(source==exitItem) System.exit(0);
else if(source==fileList)
loadZipFile((String)fileList.getSelectedItem());

}
public void scanZipFile()
{
fileList.removeAllItems();
try
{
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
while((entry=zin.getNextEntry())!=null)
{
fileList.addItem(entry.getName());
zin.closeEntry();
}
zin.close();
}
catch(IOException e)
{}
}
public void loadZipFile(String name)
{
try
{
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
fileText.setText("");
while((entry=zin.getNextEntry())!=null)
{
if(entry.getName().equals(name))
{
BufferedReader in=new BufferedReader(new InputStreamReader(zin));
String s;
while((s=in.readLine())!=null)
fileText.append(s+"\n");
}
zin.closeEntry();
}
zin.close();
}
catch(IOException e)
{}
}
public static void main(String args[])
{
Frame f=new ZipTest();
f.show();
}
}

#5


to:
 jeston
 你这里有点象的就是 int r=chooser.showOpenDialog(this);
 不过,THIS我也用过了,不行。你的这段代码我也调试了,也不行,你能显示系统对应的文件图标吗?

#6


我这里完全可以呀。

#7


我装的是jdk1.3

#8


用MVC控制一下
可以使用自己定义的图标

#9


怪呀
我用的是JBUILDER 4。0。也是java 1.3.0-C。怎么就没有呢?

#1


拿本Swing的书翻一下就知道了。如果是在windows下面用的话,可以用java.awt.FileDialog  跟windows的打开对话框完全一样,估计是调用windows的API,不能跨平台

#2


其实问题就在这里,由于AWT组件是一种对等组件,由于自身的缺点,在多平台上可能会出现问题。所以才有了SWING组件。我想,JFILECHOOSER本身不能读取文件图标可能就是跨平台做出的一种牺牲。但我想,有没有什么方法,能让JFILECHOOSER读取本地的文件系统,从而能够显示默认图标。

我想问,大家以前在做项目时,有没有类似的现象,如果有,是怎么解决的。如果没有解决,那客户允许这样的文件选取器吗?

#3


再说一句,我觉得java.awt.FileDialog 是可以跨平台的,只不过是AWT的对等组件的体系结构在绘制窗口时调用的是本地的用户界面组件。而不是在容器中自己绘制。不过,这样的话,在多个平台上是窗体否能表现一致就很值得怀疑。不过,我仅仅用的是FILEDIALGO。所以,FILEDIALOG是否在多平台上没有问题,就需要高手们来解答了。

#4


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
public class ZipTest extends JFrame implements ActionListener
{
private JComboBox fileList=new JComboBox();
private JTextArea fileText=new JTextArea();
private JScrollPane pane;
private JMenuItem openItem,exitItem;
private String zipname;
public ZipTest()
{
setTitle("ZipTest");
setSize(300,400);
        
         addWindowListener(new WindowAdapter()
{
 public void windowClosing(WindowEvent e)
{
 System.exit(0);
 }
});

JMenuBar mbar=new JMenuBar();
JMenu m=new JMenu("File");
m.setMnemonic('F');
openItem=new JMenuItem("Open",'O');
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
openItem.addActionListener(this);
m.add(openItem);
exitItem=new JMenuItem("eXit",'X');
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
exitItem.addActionListener(this);
m.add(exitItem);
mbar.add(m);

fileList.addActionListener(this);

Container c=getContentPane();
c.add(mbar,"North");
c.add(fileList,"South");
//////////////////////////////////////////////////////////////////
        fileText.setEditable(false);//设置为只读属性 
pane=new JScrollPane(fileText);//使textarea可以有滚动条
c.add(pane,"Center");
///////////////////////////////////////////////////////////////////////
//c.add(fileText,"Center");
       //show();
}
public void actionPerformed(ActionEvent evt)
{
Object source=evt.getSource();
if(source==openItem)
{
JFileChooser chooser=new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileFilter(new FileFilter()
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith(".zip")||f.isDirectory();
}
public String getDescription()
{
return "ZIP FILES";
}
});
int r=chooser.showOpenDialog(this);
if(r==JFileChooser.APPROVE_OPTION)
{
zipname=chooser.getSelectedFile().getPath();
scanZipFile();
}
}
else if(source==exitItem) System.exit(0);
else if(source==fileList)
loadZipFile((String)fileList.getSelectedItem());

}
public void scanZipFile()
{
fileList.removeAllItems();
try
{
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
while((entry=zin.getNextEntry())!=null)
{
fileList.addItem(entry.getName());
zin.closeEntry();
}
zin.close();
}
catch(IOException e)
{}
}
public void loadZipFile(String name)
{
try
{
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
fileText.setText("");
while((entry=zin.getNextEntry())!=null)
{
if(entry.getName().equals(name))
{
BufferedReader in=new BufferedReader(new InputStreamReader(zin));
String s;
while((s=in.readLine())!=null)
fileText.append(s+"\n");
}
zin.closeEntry();
}
zin.close();
}
catch(IOException e)
{}
}
public static void main(String args[])
{
Frame f=new ZipTest();
f.show();
}
}

#5


to:
 jeston
 你这里有点象的就是 int r=chooser.showOpenDialog(this);
 不过,THIS我也用过了,不行。你的这段代码我也调试了,也不行,你能显示系统对应的文件图标吗?

#6


我这里完全可以呀。

#7


我装的是jdk1.3

#8


用MVC控制一下
可以使用自己定义的图标

#9


怪呀
我用的是JBUILDER 4。0。也是java 1.3.0-C。怎么就没有呢?