【问题标题】:How to put my own type into the table如何将我自己的类型放入表中
【发布时间】:2014-08-29 01:27:12
【问题描述】:

我在 java 中找到了该问题的答案,但我不知道如何使它在 jython 中工作。 有人可以帮我翻译吗? https://sites.google.com/site/drjohnbmatthews/table

我自己试过了……

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()

我得到一个带有空表的窗口,并且:

Exception in thread "AWT-EventQueue-0" TypeError: can't convert <class __main__.Value at 0x2> to 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()

【问题讨论】:

  • 我对 jython 一无所知,但我确实知道表。您能否让我们确切地知道异常发生在哪一行,也许那些与我的知识库相似的人可以发现一些东西并做出一些有根据的猜测:-)
  • 我不知道异常行。这不像程序根本不运行。它在执行过程中运行并发生异常,并且每次我单击表格时都会重复。
  • 你没有堆栈跟踪吗?
  • 我解决了这个问题。我将工作代码作为编辑添加到问题中,以防有人发现它有用。
  • @PiotrKowalczyk-请将您的编辑添加为答案。并且,也接受它!

标签: java swing jtable jython


【解决方案1】:

这是工作代码

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多