Kyl*_*leM 2 java swing jfilechooser
下面的代码应该从JFileChooser获取默认目录图标,然后在我自定义的"Recent Directories"列表中使用该图标,该列表作为JFileChooser对话框的附件提供.有人可以解释为什么下面的代码不起作用(特别是为什么在DefaultListRenderer上的setIcon没有做到这一点),并告诉我如何将图标放在JList中的每个项目旁边?我宁愿避免实现我自己的ListCellRenderer,除非这是使其工作的唯一方法.
import java.awt.*;
import java.io.File;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class Chooser extends JPanel {
private static final String[] BUTTON_TEXTS = { "Hello", "Goodbye",
"Hello Goodbye", "Adios", "This is a long String for WTF", "Hello",
"Goodbye", "Hello Goodbye", "Adios", "This string WTF" };
public Chooser(Icon icon) {
this.setLayout(new BorderLayout());
JPanel labelPanel = new JPanel(new BorderLayout());
JLabel label = new JLabel("Recent Directories:");
labelPanel.add(label, BorderLayout.LINE_START);
labelPanel.setBackground(Color.LIGHT_GRAY);
labelPanel.setBorder(new EmptyBorder(5, 10, 5, 0));
DefaultListModel model = new DefaultListModel();
JList list = new JList(model);
DefaultListCellRenderer renderer = (DefaultListCellRenderer)list.getCellRenderer();
renderer.setIcon(icon);
for (String s : BUTTON_TEXTS) model.addElement(s);
list.setBorder(new EmptyBorder(0, 5, 5, 0));
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
// respond to selection here
}
});
add(labelPanel, BorderLayout.PAGE_START);
// add(new JScrollPane(buttonPanel), BorderLayout.CENTER);
add(new JScrollPane(list), BorderLayout.CENTER);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFileChooser fileChooser = new JFileChooser();
Icon icon = fileChooser.getIcon(new File("."));
/*JFrame frame = new JFrame();
frame.setSize(100,100);
JPanel temp = new JPanel();
JLabel tlbl = new JLabel("picture");
tlbl.setIcon(icon);
temp.add(tlbl);
frame.add(temp);
frame.setVisible(true);*/
Chooser c = new Chooser(icon);
fileChooser.setAccessory(c);
fileChooser.showOpenDialog(null);
}
}
Run Code Online (Sandbox Code Playgroud)
该DefaultListCellRenderer清除每当其图标getListCellRendererComponent方法被调用.
相反,您可以通过子类化来干扰渲染器的方法DefaultListCellRenderer:
list.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
label.setIcon(icon);
return label;
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6222 次 |
| 最近记录: |