Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable中的复选框在Windows LookAndFeel中不打印_Java_Swing_Jtable_Look And Feel - Fatal编程技术网

Java JTable中的复选框在Windows LookAndFeel中不打印

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,它的列类为Integer、String和Boolean。boolean类以JTable中checkbox的形式为我提供了列。
我尝试使用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(框架)。也许试试这个,看看它是否改变了什么,因为我现在无法检查自己。很高兴它有帮助。不要忘记通过点击复选标记(答案旁边)来“接受”答案,这样人们就知道问题已经解决了。