Java JTable中的复选框在Windows LookAndFeel中不打印
我有一个JTable,它的列类为Integer、String和Boolean。boolean类以JTable中checkbox的形式为我提供了列。Java JTable中的复选框在Windows LookAndFeel中不打印,java,swing,jtable,look-and-feel,Java,Swing,Jtable,Look And Feel,我有一个JTable,它的列类为Integer、String和Boolean。boolean类以JTable中checkbox的形式为我提供了列。 我尝试使用JTable.print()打印JTable。 每当我用Java原生lookAndFeel打印表时,所有内容都会正确打印 但每当我尝试在WindowsLookAndFeel中打印JTable时,复选框都会丢失。 我是编程新手,因此我不知道自己哪里做错了。 我附上以下代码和屏幕截图: package swing; import java.
我尝试使用JTable.print()打印JTable。 每当我用Java原生lookAndFeel打印表时,所有内容都会正确打印 但每当我尝试在WindowsLookAndFeel中打印JTable时,复选框都会丢失。 我是编程新手,因此我不知道自己哪里做错了。
我附上以下代码和屏幕截图:
package swing;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTable.PrintMode;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
public class TableExample extends JFrame{
public TableExample() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JButton print = new JButton("Print Table");
Object[][] data = {
{1, "HAIER", Boolean.TRUE},
{2, "SAMSUNG", Boolean.FALSE},
{3, "LG", Boolean.TRUE}
};
String[] columns = {"S No.", "Company", "Currently Available?"};
DefaultTableModel model = new DefaultTableModel(data, columns) {
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return columns.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
@Override
public String getColumnName(int columnIndex) {
return columns[columnIndex];
}
@Override
public Class<?> getColumnClass (int columnIndex){
return data[0][columnIndex].getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
};
JTable table = new JTable(model);
table.setFillsViewportHeight(true);
table.setPreferredScrollableViewportSize(new Dimension(600, 300));
try {
for(LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if("Windows".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exception e) {e.printStackTrace();}
JPanel panel = new JPanel(new BorderLayout());
getContentPane().add(panel);
panel.add(new JScrollPane(table), BorderLayout.CENTER);
panel.add(print, BorderLayout.NORTH);
print.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try
{
table.print(PrintMode.FIT_WIDTH);
}catch(Exception ee) {
ee.printStackTrace();
}
}
});
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TableExample();
}
});
}
}
package-swing;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JTable.PrintMode;
导入javax.swing.UIManager.LookAndFeelInfo;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.table.DefaultTableModel;
公共类TableExample扩展了JFrame{
公共表格示例(){
setDefaultCloseOperation(在关闭时处理);
JButton print=新JButton(“打印表”);
对象[][]数据={
{1,“海尔”,布尔值.TRUE},
{2,“SAMSUNG”,Boolean.FALSE},
{3,“LG”,Boolean.TRUE}
};
字符串[]列={“S编号”,“公司”,“当前可用?”};
DefaultTableModel=新的DefaultTableModel(数据、列){
@凌驾
public int getRowCount(){
返回数据长度;
}
@凌驾
public int getColumnCount(){
返回列的长度;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
返回数据[rowIndex][columnIndex];
}
@凌驾
公共字符串getColumnName(int columnIndex){
返回列[columnIndex];
}
@凌驾
公共类getColumnClass(int columnIndex){
返回数据[0][columnIndex].getClass();
}
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
JTable table=新的JTable(模型);
表.setFillsViewPerthweight(真);
table.setPreferredScrollableViewportSize(新维度(600300));
试一试{
for(LookAndFeelInfo:UIManager.getInstalledLookAndFeels()){
如果(“Windows”.equals(info.getName())){
UIManager.setLookAndFeel(info.getClassName());
打破
}
}
}catch(异常e){e.printStackTrace();}
JPanel panel=newjpanel(newborderlayout());
getContentPane().add(面板);
添加(新的JScrollPane(表),BorderLayout.CENTER);
面板。添加(打印,边框布局。北);
print.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
尝试
{
表.打印(打印模式.配合宽度);
}捕获(异常ee){
ee.printStackTrace();
}
}
});
包装();
setLocationRelativeTo(空);
setVisible(真);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的TableExample();
}
});
}
}
您对TableModel的实现是错误的,没有必要 任何模型的数据都应定义为模型的实例变量。列名和数据不应在模型之外定义 DefaultTableModel已经提供了它自己的TableModel方法的存储和实现。您无需覆盖模型的所有方法。您只需要重写需要自定义的方法。在您的情况下,似乎需要重写
getColumnClass()
和isCellEditable()
方法
因此,您的代码应该类似于:
String[] columnNames = ...
Object[][] data = ...
DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
@Override
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
return o.getClass();
}
return Object.class;
}
@Override
public boolean isCellEditable(int row, int column)
{
...
}
};
JTable table = new JTable(model);
String[]columnNames=。。。
对象[][]数据=。。。
DefaultTableModel=新的DefaultTableModel(数据、列名)
{
@凌驾
公共类getColumnClass(int列)
{
对于(int row=0;row
注意,getColumnClass(…)
方法将处理TableModel中可能有空值的情况。对于您的示例,您的实现很好
不知道这是否能解决您的Windows问题。1。)您有什么java版本?上的java教程指定在启动后更改外观后,应使用
SwingUtilities.updateComponentTreeUI(框架)代码>。也许试试这个,看看它是否改变了什么,因为我现在无法检查自己。很高兴它有帮助。不要忘记通过点击复选标记(答案旁边)来“接受”答案,这样人们就知道问题已经解决了。