Java 如何将我自己的类型放入表格中

Java 如何将我自己的类型放入表格中,java,swing,jtable,jython,Java,Swing,Jtable,Jython,我在java中找到了这个问题的答案,但我不知道如何让它在jython中工作。 有人能帮我翻译一下吗? 我试着自己和 from javax.swing import JFrame,JPanel,JScrollPane,JTable,JButton,JCheckBox,AbstractCellEditor from javax.swing.table import AbstractTableModel,TableCellEditor,TableCellRenderer from java.awt

我在java中找到了这个问题的答案,但我不知道如何让它在jython中工作。 有人能帮我翻译一下吗?

我试着自己和

from javax.swing import JFrame,JPanel,JScrollPane,JTable,JButton,JCheckBox,AbstractCellEditor
from javax.swing.table import AbstractTableModel,TableCellEditor,TableCellRenderer
from java.awt import GridLayout, Dimension 
from java.lang import String, Integer, Boolean,Class
from java.util import ArrayList, List


class TableSortDemo:

    def __init__(self):
    frame = JFrame("TableSortDemo")
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

    #Create and set up the content pane.

    self.table = JTable(MyTableModel())
    self.table.setPreferredScrollableViewportSize(Dimension(500, 170))
    self.table.setFillsViewportHeight(True)
    self.table.setDefaultRenderer(Class.forName("java.lang.Object"), ValueRenderer());
    self.table.setDefaultEditor(Class.forName("java.lang.Object"), ValueEditor());
    self.table.setAutoCreateRowSorter(True)

    #Create the scroll pane and add the table to it.
    scrollPane = JScrollPane(self.table);

    #Add the scroll pane to this panel.
    newContentPane = JPanel()
    newContentPane.add(scrollPane);
    newContentPane.setOpaque(True)    #content panes must be opaque
    frame.setContentPane(newContentPane)
    #Display the window.
    frame.pack();
    frame.setVisible(True);

class Value: #implements Comparable<Value> {

    def __init__(self,selected, value):
        self.selected = selected;
        self.value = value;

    def compareTo(self,v):
        return self.value.compareTo(v.value);

    def equals(self,v):
        return True # TODO v instanceof Value && this.value.equals(((Value) v).value);

    def hashCode(self):
        return self.value.hashCode();        

class MyTableModel (AbstractTableModel):
    MAX = 8;
    names = ["Number", "Value"];
    values = ArrayList();
    for i in range(MAX):
        values.add(Value(False, (i + 1) * 1.1));


    def getRowCount(self):
        return self.MAX;

    def getColumnCount(self):
        return len(self.names)

    def getColumnName(self, col):
        return self.names[col];

    def getValueAt(self,row,col):
        if col == 0:
            return row + 1;
        elif col == 1:
            return values.get(row);
        else:
            return null;

    def getColumnClass(self,col):
        if col == 0:
            return Integer
        elif col == 1:
            return Value
        else:
            return null;

    # Don't need to implement this method unless your table's editable.
    def isCellEditable(self,row, col):
        return col == 1;

    def setValueAt(self, aValue, row, col):
        if col == 1:
            values.get(row).selected = aValue;
            self.fireTableCellUpdated(row, col); 

class ValueRenderer (TableCellRenderer):

    def getTableCellRendererComponent(self, table, value, isSelected, hasFocus, row, col):
        v = value;
        chkbox = JCheckBox(df.format(v.value))
        chkbox.setSelected(v.selected);
        if isSelected:
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        else:
            setForeground(table.getForeground());
            setBackground(table.getBackground());

        return chkbox;

class ValueEditor (TableCellEditor): #AbstractCellEditor

    vr = ValueRenderer();

    def ValueEditor():
        vr.addItemListener(self);

    def getCellEditorValue():
        return vr.isSelected();

    def getTableCellEditorComponent(table,value,isSelected, row, col):
        v = value;
        vr.setSelected(v.selected);
        vr.setText(df.format(v.value));
        return vr;

    def itemStateChanged(e):
        self.fireEditingStopped(); 

if __name__ == '__main__':
    TableSortDemo()
来自javax.swing导入JFrame、JPanel、JScrollPane、JTable、JButton、JCheckBox、AbstractCellEditor
从javax.swing.table导入AbstractTableModel、TableCellEditor、TableCellRenderer
从java.awt导入GridLayout,维度
从java.lang导入字符串、整数、布尔值、类
从java.util导入ArrayList,列表
类表端口演示:
定义初始化(自):
frame=JFrame(“表端口演示”)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
#创建并设置内容窗格。
self.table=JTable(MyTableModel())
self.table.setPreferredScrollableViewportSize(维度(500170))
self.table.setFillsViewPerthweight(True)
setDefaultRenderer(Class.forName(“java.lang.Object”)、ValueRenderer();
self.table.setDefaultEditor(Class.forName(“java.lang.Object”),ValueEditor());
self.table.setAutoCreateRowSorter(真)
#创建滚动窗格并将表添加到其中。
scrollPane=JScrollPane(self.table);
#将滚动窗格添加到此面板。
newContentPane=JPanel()
添加(滚动窗格);
newContentPane.SetObaque(True)#内容窗格必须是不透明的
frame.setContentPane(newContentPane)
#显示窗口。
frame.pack();
frame.setVisible(True);
类值:#实现可比较{
定义初始值(自身、选定、值):
self.selected=已选择;
自我价值=价值;
def比较器(自身,v):
返回self.value.compareTo(v.value);
def等于(self,v):
返回True#TODO v instanceof Value&&this.Value.equals(((Value)v.Value);
def哈希代码(自身):
返回self.value.hashCode();
类MyTableModel(AbstractTableModel):
最大值=8;
名称=[“数字”、“值”];
values=ArrayList();
对于范围内的i(最大值):
添加(值(假,(i+1)*1.1));
def getRowCount(自身):
返回self.MAX;
def getColumnCount(自身):
返回len(self.names)
def getColumnName(自身,列):
返回self.names[col];
def getValueAt(自身、行、列):
如果col==0:
返回行+1;
elif col==1:
返回值.get(行);
其他:
返回null;
def getColumnClass(自身,列):
如果col==0:
返回整数
elif col==1:
返回值
其他:
返回null;
#除非您的表是可编辑的,否则不需要实现此方法。
def isCellEditable(自身、行、列):
返回col==1;
def setValueAt(自身、aValue、行、列):
如果col==1:
value.get(row).selected=aValue;
自我更新的FireTableCell(行、列);
类ValueRenderer(TableCellRenderer):
def GetTableCellRenderComponent(self、table、value、isSelected、hasFocus、row、col):
v=值;
chkbox=JCheckBox(df.format(v.value))
chkbox.setSelected(v.selected);
如果当选:
setForeground(table.getSelectionForeground());
挫折背景(table.getSelectionBackground());
其他:
set前台(table.get前台());
挫折背景(table.getBackground());
返回chkbox;
类ValueEditor(TableCellEditor):#AbstractCellEditor
vr=ValueRenderer();
def ValueEditor():
vr.addItemListener(自我);
def getCellEditorValue():
返回vr.isSelected();
def GetTableCellEditor组件(表、值、isSelected、行、列):
v=值;
vr.选择的设置(v.选择);
vr.setText(df.format(v.value));
返回虚拟现实;
def itemStateChanged(e):
self.fireEditingStopped();
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TableSortDemo()
我得到一个空桌子的窗口,并且:

Exception in thread "AWT-EventQueue-0" TypeError: can't convert <class __main__.Value at 0x2> to java.lang.Class
线程“AWT-EventQueue-0”类型中出现异常错误:无法转换为java.lang.Class
堆栈跟踪

编辑(这是工作代码)

from javax.swing import JFrame,JPanel,JScrollPane,JTable,JButton,JCheckBox,AbstractCellEditor
from javax.swing.table import AbstractTableModel,TableCellEditor,TableCellRenderer
from java.awt import GridLayout, Dimension 
from java.lang import String, Integer, Boolean,Class,Comparable
from java.util import ArrayList, List
from java.text import DecimalFormat

df = DecimalFormat("#0.00");
class TableSortDemo:


    def __init__(self):
        frame = JFrame("TableSortDemo")
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

        #Create and set up the content pane.       
        self.table = JTable(MyTableModel())
        self.table.setPreferredScrollableViewportSize(Dimension(500, 170))
        self.table.setFillsViewportHeight(True)
        self.table.setDefaultRenderer(Class.forName("java.lang.Object"), ValueRenderer());
        self.table.setDefaultEditor(Class.forName("java.lang.Object"), ValueEditor());
        self.table.setAutoCreateRowSorter(True)

        #Create the scroll pane and add the table to it.
        scrollPane = JScrollPane(self.table);

        #Add the scroll pane to this panel.
        newContentPane = JPanel()
        newContentPane.add(scrollPane);
        newContentPane.setOpaque(True)    #content panes must be opaque
        frame.setContentPane(newContentPane)
        #Display the window.
        frame.pack();
        frame.setVisible(True);

class Value(Comparable): #implements Comparable<Value> {

    def __init__(self,selected, value):
        self.selected = selected;
        self.value = value;

    def compareTo(self,v):
        return cmp(self.value-v.value, 0)

    def equals(self,v):
        return self.value == v.value

    def hashCode(self):
        return self.value.hashCode();        

class MyTableModel (AbstractTableModel):
    MAX = 8;
    names = ["Number", "Value"];
    values = ArrayList();
    for i in range(MAX):
        values.add(Value(False, (i + 1) * 1.1));

    def getRowCount(self):
        return self.MAX;

    def getColumnCount(self):
        return len(self.names)

    def getColumnName(self, col):
        return self.names[col];

    def getValueAt(self,row,col):
        if col == 0:
            return row + 1;
        elif col == 1:
            return self.values[row]
        else:
            return None

    def getColumnClass(self,col):
        if col == 0:
            return Integer
        elif col == 1:
            return Value
        else:
            return None;

    # Don't need to implement this method unless your table's editable.
    def isCellEditable(self,row, col):
        return col == 1;

    def setValueAt(self, aValue, row, col):
        if col == 1:
            self.values.get(row).selected = aValue;
            self.fireTableCellUpdated(row, col); 

class ValueRenderer (JCheckBox,TableCellRenderer):

    def getTableCellRendererComponent(self, table, value, isSelected, hasFocus, row, col):
        v = value;
        self.text = df.format(v.value)
        self.setSelected(v.selected);
        if isSelected:
            self.setForeground(table.getSelectionForeground());
            self.setBackground(table.getSelectionBackground());
        else:
            self.setForeground(table.getForeground());
            self.setBackground(table.getBackground());
        return self

class ValueEditor (TableCellEditor,AbstractCellEditor):

    def __init__(self):
        self.vr = ValueRenderer()

    def ValueEditor():
        self.vr.addItemListener(self);

    def getCellEditorValue(self):
        return self.vr.isSelected();

    def getTableCellEditorComponent(self,table,value,isSelected, row, col):
        v = value;
        self.vr.setSelected(v.selected);
        self.vr.setText(df.format(v.value));
        return self.vr;

    def itemStateChanged(self,e):
        self.fireEditingStopped(); 

if __name__ == '__main__':
    TableSortDemo()
来自javax.swing导入JFrame、JPanel、JScrollPane、JTable、JButton、JCheckBox、AbstractCellEditor
从javax.swing.table导入AbstractTableModel、TableCellEditor、TableCellRenderer
从java.awt导入GridLayout,维度
从java.lang导入字符串、整数、布尔值、类、可比较
从java.util导入ArrayList,列表
从java.text导入DecimalFormat
df=十进制(“0.00”);
类表端口演示:
定义初始化(自):
frame=JFrame(“表端口演示”)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
#创建并设置内容窗格。
self.table=JTable(MyTableModel())
self.table.setPreferredScrollableViewportSize(维度(500170))
self.table.setFillsViewPerthweight(True)
setDefaultRenderer(Class.forName(“java.lang.Object”)、ValueRenderer();
self.table.setDefaultEditor(Class.forName(“java.lang.Object”),ValueEditor());
self.table.setAutoCreateRowSorter(真)
#创建滚动窗格并将表添加到其中。
scrollPane=JScrollPane(self.table);
#将滚动窗格添加到此面板。
newContentPane=JPanel()
添加(滚动窗格);
newContentPane.SetObaque(True)#内容窗格必须是不透明的
frame.setContentPane(newContentPane)
#显示窗口。
frame.pack();
frame.setVisible(True);
类值(可比):#实现可比{
定义初始值(自身、选定、值):
self.selected=已选择;
自我价值=价值;
def比较器(自身,v):
返回cmp(自值-v值,0)
def等于(self,v):
返回self.value==v.value
def哈希代码(自身):
返回self.value.hashCode();
类MyTableModel(AbstractTableModel):
最大值=8;
名称=[“数字”、“值”];
values=ArrayList();
法罗群岛
from javax.swing import JFrame,JPanel,JScrollPane,JTable,JButton,JCheckBox,AbstractCellEditor
from javax.swing.table import AbstractTableModel,TableCellEditor,TableCellRenderer
from java.awt import GridLayout, Dimension 
from java.lang import String, Integer, Boolean,Class,Comparable
from java.util import ArrayList, List
from java.text import DecimalFormat

df = DecimalFormat("#0.00");
class TableSortDemo:


    def __init__(self):
        frame = JFrame("TableSortDemo")
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

        #Create and set up the content pane.       
        self.table = JTable(MyTableModel())
        self.table.setPreferredScrollableViewportSize(Dimension(500, 170))
        self.table.setFillsViewportHeight(True)
        self.table.setDefaultRenderer(Class.forName("java.lang.Object"), ValueRenderer());
        self.table.setDefaultEditor(Class.forName("java.lang.Object"), ValueEditor());
        self.table.setAutoCreateRowSorter(True)

        #Create the scroll pane and add the table to it.
        scrollPane = JScrollPane(self.table);

        #Add the scroll pane to this panel.
        newContentPane = JPanel()
        newContentPane.add(scrollPane);
        newContentPane.setOpaque(True)    #content panes must be opaque
        frame.setContentPane(newContentPane)
        #Display the window.
        frame.pack();
        frame.setVisible(True);

class Value(Comparable): #implements Comparable<Value> {

    def __init__(self,selected, value):
        self.selected = selected;
        self.value = value;

    def compareTo(self,v):
        return cmp(self.value-v.value, 0)

    def equals(self,v):
        return self.value == v.value

    def hashCode(self):
        return self.value.hashCode();        

class MyTableModel (AbstractTableModel):
    MAX = 8;
    names = ["Number", "Value"];
    values = ArrayList();
    for i in range(MAX):
        values.add(Value(False, (i + 1) * 1.1));

    def getRowCount(self):
        return self.MAX;

    def getColumnCount(self):
        return len(self.names)

    def getColumnName(self, col):
        return self.names[col];

    def getValueAt(self,row,col):
        if col == 0:
            return row + 1;
        elif col == 1:
            return self.values[row]
        else:
            return None

    def getColumnClass(self,col):
        if col == 0:
            return Integer
        elif col == 1:
            return Value
        else:
            return None;

    # Don't need to implement this method unless your table's editable.
    def isCellEditable(self,row, col):
        return col == 1;

    def setValueAt(self, aValue, row, col):
        if col == 1:
            self.values.get(row).selected = aValue;
            self.fireTableCellUpdated(row, col); 

class ValueRenderer (JCheckBox,TableCellRenderer):

    def getTableCellRendererComponent(self, table, value, isSelected, hasFocus, row, col):
        v = value;
        self.text = df.format(v.value)
        self.setSelected(v.selected);
        if isSelected:
            self.setForeground(table.getSelectionForeground());
            self.setBackground(table.getSelectionBackground());
        else:
            self.setForeground(table.getForeground());
            self.setBackground(table.getBackground());
        return self

class ValueEditor (TableCellEditor,AbstractCellEditor):

    def __init__(self):
        self.vr = ValueRenderer()

    def ValueEditor():
        self.vr.addItemListener(self);

    def getCellEditorValue(self):
        return self.vr.isSelected();

    def getTableCellEditorComponent(self,table,value,isSelected, row, col):
        v = value;
        self.vr.setSelected(v.selected);
        self.vr.setText(df.format(v.value));
        return self.vr;

    def itemStateChanged(self,e):
        self.fireEditingStopped(); 

if __name__ == '__main__':
    TableSortDemo()