Mad*_*ady 2 java swing jtable tablecellrenderer
这可能是一个模糊的查询,所以请原谅我.
自定义JTable(我修改了查询,并将根据提供的SSCCE进行讨论).我将创建一个JTable,根据JTable中选中的复选框提供授权
此JTable的目的是向用户显示应用程序的所有菜单选项.这个JTable有三列:第一列:类Bollean(复选框)第二列:类String(主菜单项)第三列:class String(子菜单项)
要提供授权,用户应选择与子菜单项对应的复选框,最后选择"授权"按钮(由于我的授权功能正常,我没有在此包含授权按钮)
现在UI要求是在JTable的第一列中,我应该只显示与子菜单项对应的复选框,而不是在第一列的每个单元格中显示复选框(换句话说,它不应该显示与主菜单项对应的复选框)
下面的图片是预期输出(虽然我的第一列中的所有单元格都带有复选框)

public class SwingSolution extends JPanel {
public SwingSolution() {
super(new GridLayout(1,0));
String[] columnNames = {"", "Main Menu", "Sub Menu"};
Object[][] data = {
{false, "File", ""},
{false, "", "New"},
{false, "", "Save"},
{false, "", "Close"},
{false, "Edit", ""},
{false, "", "Delete"},
{false, "", "Format"},
{false, "Project", ""},
{false, "", "Create New"},
{false, "", "Delete"},
{false, "", "Build"},
{false, "", "Properties"},
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
final JTable table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
case 2:
return String.class;
default:
return Boolean.class;
}
}
};
table.getColumnModel().getColumn(0).setMaxWidth(30);
table.getColumnModel().getColumn(1).setMaxWidth(100);
table.getColumnModel().getColumn(2).setMaxWidth(120);
table.setPreferredScrollableViewportSize(new Dimension(250, 195));
table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
SwingSolution newContentPane = new SwingSolution();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我用单元格渲染器尝试了各种各样的东西,用google搜索JTable和自定义单元格,但无法弄明白.任何帮助将不胜感激
基本上,你将为你提供细胞渲染器和编辑器.
在这种情况下,我将第一列值/类型更改为int.这使我能够提供额外的意义boolean.
如果列值是0单元格不是"可选",1则取消选中,2则选中该单元格.
我还改变了isCellEditable方法,TableModel只允许"活动"单元格可编辑.

import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class LimitedTableCellEditor extends JPanel {
public LimitedTableCellEditor() {
super(new GridLayout(1, 0));
String[] columnNames = {"", "Main Menu", "Sub Menu",};
Object[][] data = {
{0, "File", ""},
{1, "", "New"},
{1, "", "Save"},
{1, "", "Close"},
{0, "Edit", ""},
{1, "", "Delete"},
{1, "", "Format"},
{0, "Project", ""},
{1, "", "Create New"},
{1, "", "Delete"},
{1, "", "Build"},
{1, "", "Properties"},};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
final JTable table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Integer.class;
case 1:
return String.class;
case 2:
return String.class;
default:
return Boolean.class;
}
}
@Override
public boolean isCellEditable(int row, int column) {
boolean editable = false;
if (column == 0) {
Object value = getValueAt(row, column);
if (value instanceof Integer) {
editable = ((int)value) != 0;
}
}
return editable;
}
};
table.getColumnModel().getColumn(0).setMaxWidth(30);
table.getColumnModel().getColumn(0).setCellRenderer(new ConditionalCheckBoxRenderer());
table.getColumnModel().getColumn(1).setMaxWidth(100);
table.getColumnModel().getColumn(2).setMaxWidth(120);
table.setPreferredScrollableViewportSize(new Dimension(250, 195));
table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
LimitedTableCellEditor newContentPane = new LimitedTableCellEditor();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static class ConditionalCheckBoxRenderer extends JPanel implements TableCellRenderer {
private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
private JCheckBox cb;
public ConditionalCheckBoxRenderer() {
setLayout(new GridBagLayout());
setOpaque(false);
cb = new JCheckBox();
cb.setOpaque(false);
cb.setContentAreaFilled(false);
cb.setMargin(new Insets(0, 0, 0, 0));
add(cb);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(isSelected);
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
}
if (value instanceof Integer) {
int state = (int) value;
cb.setVisible(state != 0);
cb.setSelected(state == 2);
}
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
} else {
setBorder(NO_FOCUS_BORDER);
}
return this;
}
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我没有完成编辑,但基本概念是一样的......
| 归档时间: |
|
| 查看次数: |
3811 次 |
| 最近记录: |