gpt4 book ai didi

java - 带有上下文菜单的文件列表

转载 作者:行者123 更新时间:2023-11-30 11:40:22 25 4
gpt4 key购买 nike

Application Example

你好, 我是 Swing 的新手。我想知道将与行上的文件名相关的按钮集关联起来的正确方法。我正在使用控制 View 模式。这是当我想在 JPanel 上添加文件时控件调用的代码:

public void addFileToTheList(File selectedFile) {

/*file name */
fileName = new JLabel(selectedFile.getName());

/* menu buttons */
editButton = new JButton("edit ");
resultsButton = new JButton("results");
takeTestButton = new JButton("take");
deleteButton = new JButton("delete");

testsListDiv.add(fileName);
testsListDiv.add(editButton);
testsListDiv.add(resultsButton);
testsListDiv.add(takeTestButton);
testsListDiv.add(deleteButton);

/* update the scroll list*/
scrollList.revalidate();
scrollList.repaint();
}

感谢您的宝贵时间。

最佳答案

按照每个人的建议(无论如何我都会建议),这里有一个小的演示片段来说明这个案例。在左侧,我添加了一个 JFileChooser,以便您可以浏览磁盘以查看代表性案例,但您关心的是右侧的 JTable。

它需要一个额外的类:ButtonColumn ,但您可以使用它来注释行,只是没有按钮。

结果如下: Sample of the resulting JFrame

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Arrays;

import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;

public class TestFileTable {

public class DirectoryModel extends AbstractTableModel {

private File directory;

private File[] files;

public DirectoryModel(File directory) {
super();
setDiretory(directory);
}

@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "";
case 1:
return "File name";
case 2:
return "";
default:
break;
}
return "";
}

@Override
public int getRowCount() {
return files.length;
}

@Override
public int getColumnCount() {
return 6;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex > 1;// button columns
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return FileSystemView.getFileSystemView().getSystemIcon(files[rowIndex]);
case 1:
return files[rowIndex].getName();
case 2:
return "Edit";
case 3:
return "Results";
case 4:
return "Take";
case 5:
return "Delete";
}
return null;
}

public TableModel setDiretory(File currentDirectory) {
this.directory = currentDirectory;
files = directory.listFiles();
if (files == null) {
files = new File[0];
}
Arrays.sort(files);
fireTableDataChanged();
return this;
}

}

protected void initUI() {
JFrame frame = new JFrame(TestFileTable.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable();
final JFileChooser fileChooser = new JFileChooser();
final DirectoryModel model = new DirectoryModel(fileChooser.getCurrentDirectory());
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.addPropertyChangeListener(JFileChooser.DIRECTORY_CHANGED_PROPERTY, new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
table.setModel(model.setDiretory(fileChooser.getCurrentDirectory()));
}
});
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
table.setShowGrid(false);
table.setIntercellSpacing(new Dimension(10, 10));
table.setRowHeight(30);
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
@Override
protected void setValue(Object value) {
if (value instanceof Icon) {
setText(null);
setIcon((Icon) value);
} else {
super.setValue(value);
}
}
});
columnModel.getColumn(0).setPreferredWidth(36);
columnModel.getColumn(0).setMaxWidth(36);
table.setTableHeader(null);

// If you don't have the class ButtonCOlumn, comment the next lines, it still works
// You can get it at http://tips4java.wordpress.com/2009/07/12/table-button-column/
new ButtonColumn(table, new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(table, "You have chosen to edit " + table.getModel().getValueAt(table.getSelectedRow(), 1));
}
}, 2);
new ButtonColumn(table, new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(table,
"You have chosen to show results for " + table.getModel().getValueAt(table.getSelectedRow(), 1));
}
}, 3);
new ButtonColumn(table, new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(table, "You have chosen to take " + table.getModel().getValueAt(table.getSelectedRow(), 1));
}
}, 4);
new ButtonColumn(table, new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(table, "You have chosen to delete " + table.getModel().getValueAt(table.getSelectedRow(), 1));
}
}, 5);

frame.add(fileChooser, BorderLayout.WEST);
frame.add(new JScrollPane(table));
frame.setSize(1200, 600);
frame.setVisible(true);
}

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new TestFileTable().initUI();
}
});
}
}

关于java - 带有上下文菜单的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12771152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com