JXTreeTable 中的复选框

2023-12-06

仍然是一个 Java 新手,为了我自己的利益而试图做太高级的事情。尽管如此,这就是我需要做的:JXTreeTable 中的复选框。我的主要课程:

package info.chrismcgee.sky.production;

import info.chrismcgee.sky.production.treetable.NoRootTreeTableModel;

import java.awt.Checkbox;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;

import net.miginfocom.swing.MigLayout;

import org.jdesktop.swingx.JXTreeTable;

public class TestFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = -1899673458785493250L;
    private JXTreeTable treeTable;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    TestFrame frame = new TestFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestFrame() {
        setMinimumSize(new Dimension(600, 600));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 546, 600);
        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new MigLayout("", "[grow][grow][grow][100px:n,grow][grow][grow][grow]", "[][251.00,grow][]"));
        
        List<Job> jobList = new ArrayList<Job>();
        
        List<ItemDetail> itemList = new ArrayList<ItemDetail>();
        itemList.add(new ItemDetail("N10", "N10", 2, 1000, PrintType.PAD, true));
        itemList.add(new ItemDetail("N13", "N13", 2, 2000, PrintType.PAD, true));
        
        // create and add the first job with its list of ItemDetail objects
        jobList.add(new Job(new Checkbox("Print Solutions"), "123456", ShipDate.getDate("02/28/14"), itemList));
        
        List<ItemDetail> itemList2 = new ArrayList<ItemDetail>();
        itemList2.add(new ItemDetail("P12", "Green", 1, 250, PrintType.SCREEN, true));
        itemList2.add(new ItemDetail("P12", "Purple", 1, 250, PrintType.SCREEN, true));
        itemList2.add(new ItemDetail("P12", "Gray", 1, 250, PrintType.SCREEN, true));
        
        // create and add a second job with its list of ItemDetail objects
        jobList.add(new Job(new Checkbox("Innovators Inc"), "246801", ShipDate.getDate("03/10/14"), itemList2));
        
        // we use a no root model
        NoRootTreeTableModel noRootTreeTableModel = new NoRootTreeTableModel(jobList);
        treeTable = new JXTreeTable(noRootTreeTableModel);
        treeTable.setEditable(false);
        treeTable.setRootVisible(false);
        treeTable.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
        treeTable.getTableHeader().setReorderingAllowed(false);
        treeTable.getColumn(0).setPreferredWidth(200);
        treeTable.getColumn(1).setPreferredWidth(75);
        treeTable.getColumn(2).setPreferredWidth(15);
            treeTable.getColumn(2).setMinWidth(15);
            treeTable.getColumn(2).setMaxWidth(15);
        treeTable.getColumn(3).setPreferredWidth(50);
            treeTable.getColumn(3).setMaxWidth(50);
        treeTable.getColumn(4).setPreferredWidth(25);
        JScrollPane scrollPane = new JScrollPane(treeTable);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        contentPane.add(scrollPane, "cell 0 1 7 1,grow");

    }       
}

Job 类(TreeTable 中的分支):

package info.chrismcgee.sky.production;

import java.awt.Checkbox;
import java.util.List;

import org.joda.time.LocalDate;

public class Job {

    private Checkbox cbJob;
    private String idNumber;
    private LocalDate shipDate;
    private List<ItemDetail> itemList;
    
    public Job(Checkbox cbJob, String idNumber, LocalDate shipDate, List<ItemDetail> itemList)
    {
        this.cbJob = cbJob;
        this.idNumber = idNumber;
        this.shipDate = shipDate;
        this.itemList = itemList;
    }

    public List<ItemDetail> getItemList()
    {
        return itemList;
    }
    
    public void setItemList(List<ItemDetail> itemList)
    {
        this.itemList = itemList;
    }
    
    /**
     * @return the cbJob
     */
    public Checkbox getCbJob() {
        return cbJob;
    }

    /**
     * @param cbJob the cbJob to set
     */
    public void setCbJob(Checkbox cbJob) {
        this.cbJob = cbJob;
    }

    /**
     * @return the idNumber
     */
    public String getIdNumber() {
        return idNumber;
    }

    /**
     * @param idNumber the idNumber to set
     */
    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    /**
     * @return the shipDate
     */
    public LocalDate getShipDate() {
        return shipDate;
    }

    /**
     * @param shipDate the shipDate to set
     */
    public void setShipDate(LocalDate shipDate) {
        this.shipDate = shipDate;
    }
    
}

OrderDetail 类(TreeTable 中的叶子):

package info.chrismcgee.sky.production;


public class ItemDetail {

    private String productId;
    private String detail;
    private long numColors;
    private long numQuantity;
    private PrintType printType;
    private boolean active;
    
    public ItemDetail(String productId, String detail, long numColors, long numQuantity, PrintType printType, boolean active)
    {
        this.productId = productId;
        this.detail = detail;
        this.numColors = numColors;
        this.numQuantity = numQuantity;
        this.printType = printType;
        this.active = active;
    }

    /**
     * @return the productId
     */
    public String getProductId() {
        return productId;
    }

    /**
     * @param productId the productId to set
     */
    public void setProductId(String productId) {
        this.productId = productId;
    }

    /**
     * @return the detail
     */
    public String getDetail() {
        return detail;
    }

    /**
     * @param detail the detail to set
     */
    public void setDetail(String detail) {
        this.detail = detail;
    }

    /**
     * @return the numColors
     */
    public long getNumColors() {
        return numColors;
    }

    /**
     * @param numColors the numColors to set
     */
    public void setNumColors(long numColors) {
        this.numColors = numColors;
    }

    /**
     * @return the numQuantity
     */
    public long getNumQuantity() {
        return numQuantity;
    }

    /**
     * @param numQuantity the numQuantity to set
     */
    public void setNumQuantity(long numQuantity) {
        this.numQuantity = numQuantity;
    }

    /**
     * @return the printType
     */
    public PrintType getPrintType() {
        return printType;
    }

    /**
     * @param printType the printType to set
     */
    public void setPrintType(PrintType printType) {
        this.printType = printType;
    }

    /**
     * @return the active
     */
    public boolean isActive() {
        return active;
    }

    /**
     * @param active the active to set
     */
    public void setActive(boolean active) {
        this.active = active;
    }

}

最后是 NoRootTreeTableModel 类,它扩展了 AbstractTreeTableModel 类,因此不会显示树的根:

package info.chrismcgee.sky.production.treetable;

import info.chrismcgee.sky.production.ItemDetail;
import info.chrismcgee.sky.production.Job;

import java.util.List;

import org.jdesktop.swingx.treetable.AbstractTreeTableModel;

public class NoRootTreeTableModel extends AbstractTreeTableModel {
    
    private final static String[] COLUMN_NAMES = {"Name/Product", "Job # / Detail", "T",
        "Colors", "Quantity", "Total"};
    
    private List<Job> jobList;
    
    public NoRootTreeTableModel(List<Job> jobList)
    {
        super(new Object());
        this.jobList = jobList;
    }

    @Override
    public int getColumnCount() {
        return COLUMN_NAMES.length;
    }

    @Override
    public String getColumnName(int column)
    {
        return COLUMN_NAMES[column];
    }
    
    @Override
    public boolean isCellEditable(Object node, int column)
    {
        return false;
    }
    
    @Override
    public boolean isLeaf(Object node)
    {
        return node instanceof ItemDetail;
    }

    @Override
    public int getChildCount(Object parent) {
        if (parent instanceof Job) {
            Job job = (Job) parent;
            return job.getItemList().size();
        }
        return jobList.size();
    }
    
    @Override
    public Object getChild(Object parent, int index) {
        if (parent instanceof Job) {
            Job job = (Job) parent;
            return job.getItemList().get(index);
        }
        return jobList.get(index);
    }
    
    @Override
    public int getIndexOfChild(Object parent, Object child) {
        Job job = (Job) parent;
        ItemDetail item = (ItemDetail) child;
        return job.getItemList().indexOf(item);
    }
    
    @Override
    public Object getValueAt(Object node, int column) {
        if (node instanceof Job) {
            Job job = (Job) node;
            switch (column) {
                case 0:
                    return job.getCbJob();
                case 1:
                    return job.getIdNumber();
            }
        } else if (node instanceof ItemDetail) {
            ItemDetail item = (ItemDetail) node;
            switch (column) {
                case 0:
                    return item.getProductId();
                case 1:
                    return item.getDetail();
                case 2:
                    return item.getPrintType();
                case 3:
                    return item.getNumColors();
                case 4:
                    return item.getNumQuantity();
                case 5:
                    return item.getNumColors() * item.getNumQuantity();
            }
        }
        return null;
    }

}

我知道这是很多代码,但我想不出一种快速方法来减少它并仍然让它按照我需要的方式工作。事实上,它已经减少了不少。 (我遗漏了一些通常也在该 JFrame 中的内容。)

When the code is run, I don't get a checkbox for the branches; instead, I get what appears to be a String representation of the checkbox code: Checkbox in a TreeTable

啊?这是怎么发生的,更重要的是,我怎样才能让复选框显示出来?


您永远不应该向模型添加组件,而应该提供TreeCellRenderer渲染节点的值。该节点可能正在使用toString分配给它的用户对象的值...

看一眼如何使用树木 and 自定义树的显示更多细节

直接从以下内容中提取的示例自定义树的显示

Check Boxes

我将由您创建编辑器并确定如何选择复选框

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class TreeExample {

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

                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

                    //Create and set up the window.
                    JFrame frame = new JFrame("GenealogyExample");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                    //Create and set up the content pane.
                    GenealogyExample newContentPane = new GenealogyExample();
                    newContentPane.setOpaque(true); //content panes must be opaque
                    frame.setContentPane(newContentPane);

                    //Display the window.
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public static class GenealogyExample extends JPanel
            implements ActionListener {

        private JTree tree;
        private static String SHOW_ANCESTOR_CMD = "showAncestor";

        public GenealogyExample() {
            super(new BorderLayout());

            //Construct the panel with the toggle buttons.
            JRadioButton showDescendant
                    = new JRadioButton("Show descendants", true);
            final JRadioButton showAncestor
                    = new JRadioButton("Show ancestors");
            ButtonGroup bGroup = new ButtonGroup();
            bGroup.add(showDescendant);
            bGroup.add(showAncestor);
            showDescendant.addActionListener(this);
            showAncestor.addActionListener(this);
            showAncestor.setActionCommand(SHOW_ANCESTOR_CMD);
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(showDescendant);
            buttonPanel.add(showAncestor);

            //Construct the tree.
            tree = new JTree(new GenealogyModel(getGenealogyGraph()));
      tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            tree.setCellRenderer(new CheckBoxTreeCellRenderer());

            JScrollPane scrollPane = new JScrollPane(tree);
            scrollPane.setPreferredSize(new Dimension(200, 200));

            //Add everything to this panel.
            add(buttonPanel, BorderLayout.PAGE_START);
            add(scrollPane, BorderLayout.CENTER);
        }

        /**
         * Required by the ActionListener interface. Handle events on the
         * showDescendant and showAncestore buttons.
         */
        public void actionPerformed(ActionEvent ae) {
            if (ae.getActionCommand() == SHOW_ANCESTOR_CMD) {
                showAncestor(true);
            } else {
                showAncestor(false);
            }
        }

        public void showAncestor(boolean b) {
        Object newRoot = null;
        TreePath path = tree.getSelectionModel().getSelectionPath();
        if (path != null) {
            newRoot = path.getLastPathComponent();
        }
        ((GenealogyModel)tree.getModel()).showAncestor(b, newRoot);
    }

        /**
         * Constructs the genealogy graph used by the model.
         */
        public Person getGenealogyGraph() {
            //the greatgrandparent generation
            Person a1 = new Person("Jack (great-granddaddy)");
            Person a2 = new Person("Jean (great-granny)");
            Person a3 = new Person("Albert (great-granddaddy)");
            Person a4 = new Person("Rae (great-granny)");
            Person a5 = new Person("Paul (great-granddaddy)");
            Person a6 = new Person("Josie (great-granny)");

            //the grandparent generation
            Person b1 = new Person("Peter (grandpa)");
            Person b2 = new Person("Zoe (grandma)");
            Person b3 = new Person("Simon (grandpa)");
            Person b4 = new Person("James (grandpa)");
            Person b5 = new Person("Bertha (grandma)");
            Person b6 = new Person("Veronica (grandma)");
            Person b7 = new Person("Anne (grandma)");
            Person b8 = new Person("Renee (grandma)");
            Person b9 = new Person("Joseph (grandpa)");

            //the parent generation
            Person c1 = new Person("Isabelle (mom)");
            Person c2 = new Person("Frank (dad)");
            Person c3 = new Person("Louis (dad)");
            Person c4 = new Person("Laurence (dad)");
            Person c5 = new Person("Valerie (mom)");
            Person c6 = new Person("Marie (mom)");
            Person c7 = new Person("Helen (mom)");
            Person c8 = new Person("Mark (dad)");
            Person c9 = new Person("Oliver (dad)");

            //the youngest generation
            Person d1 = new Person("Clement (boy)");
            Person d2 = new Person("Colin (boy)");

            Person.linkFamily(a1, a2, new Person[]{b1, b2, b3, b4});
            Person.linkFamily(a3, a4, new Person[]{b5, b6, b7});
            Person.linkFamily(a5, a6, new Person[]{b8, b9});
            Person.linkFamily(b3, b6, new Person[]{c1, c2, c3});
            Person.linkFamily(b4, b5, new Person[]{c4, c5, c6});
            Person.linkFamily(b8, b7, new Person[]{c7, c8, c9});
            Person.linkFamily(c4, c7, new Person[]{d1, d2});

            return a1;
        }

    }

    public static class CheckBoxTreeCellRenderer implements TreeCellRenderer {

        private JCheckBox cb = new JCheckBox();

        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

            cb.setText(value.toString());
            cb.setOpaque(selected);
            if (selected) {
                cb.setBackground(UIManager.getColor("Tree.selectionBackground"));
                cb.setForeground(UIManager.getColor("Tree.selectionForeground"));
            } else {
                cb.setBackground(tree.getBackground());
                cb.setForeground(tree.getForeground());
            }

            return cb;

        }

    } 

    public static class GenealogyModel implements TreeModel {

        private boolean showAncestors;
        private Vector<TreeModelListener> treeModelListeners
                = new Vector<TreeModelListener>();
        private Person rootPerson;

        public GenealogyModel(Person root) {
            showAncestors = false;
            rootPerson = root;
        }

        /**
         * Used to toggle between show ancestors/show descendant and to change the
         * root of the tree.
         */
        public void showAncestor(boolean b, Object newRoot) {
            showAncestors = b;
            Person oldRoot = rootPerson;
            if (newRoot != null) {
                rootPerson = (Person) newRoot;
            }
            fireTreeStructureChanged(oldRoot);
        }

//////////////// Fire events //////////////////////////////////////////////
        /**
         * The only event raised by this model is TreeStructureChanged with the root
         * as path, i.e. the whole tree has changed.
         */
        protected void fireTreeStructureChanged(Person oldRoot) {
            int len = treeModelListeners.size();
            TreeModelEvent e = new TreeModelEvent(this,
                    new Object[]{oldRoot});
            for (TreeModelListener tml : treeModelListeners) {
                tml.treeStructureChanged(e);
            }
        }

//////////////// TreeModel interface implementation ///////////////////////
        /**
         * Adds a listener for the TreeModelEvent posted after the tree changes.
         */
        public void addTreeModelListener(TreeModelListener l) {
            treeModelListeners.addElement(l);
        }

        /**
         * Returns the child of parent at index index in the parent's child array.
         */
        public Object getChild(Object parent, int index) {
            Person p = (Person) parent;
            if (showAncestors) {
                if ((index > 0) && (p.getFather() != null)) {
                    return p.getMother();
                }
                return p.getFather();
            }
            return p.getChildAt(index);
        }

        /**
         * Returns the number of children of parent.
         */
        public int getChildCount(Object parent) {
            Person p = (Person) parent;
            if (showAncestors) {
                int count = 0;
                if (p.getFather() != null) {
                    count++;
                }
                if (p.getMother() != null) {
                    count++;
                }
                return count;
            }
            return p.getChildCount();
        }

        /**
         * Returns the index of child in parent.
         */
        public int getIndexOfChild(Object parent, Object child) {
            Person p = (Person) parent;
            if (showAncestors) {
                int count = 0;
                Person father = p.getFather();
                if (father != null) {
                    count++;
                    if (father == child) {
                        return 0;
                    }
                }
                if (p.getMother() != child) {
                    return count;
                }
                return -1;
            }
            return p.getIndexOfChild((Person) child);
        }

        /**
         * Returns the root of the tree.
         */
        public Object getRoot() {
            return rootPerson;
        }

        /**
         * Returns true if node is a leaf.
         */
        public boolean isLeaf(Object node) {
            Person p = (Person) node;
            if (showAncestors) {
                return ((p.getFather() == null)
                        && (p.getMother() == null));
            }
            return p.getChildCount() == 0;
        }

        /**
         * Removes a listener previously added with addTreeModelListener().
         */
        public void removeTreeModelListener(TreeModelListener l) {
            treeModelListeners.removeElement(l);
        }

        /**
         * Messaged when the user has altered the value for the item identified by
         * path to newValue. Not used by this model.
         */
        public void valueForPathChanged(TreePath path, Object newValue) {
            System.out.println("*** valueForPathChanged : "
                    + path + " --> " + newValue);
        }
    }

    public static class Person {

        Person father;
        Person mother;
        List<Person> children;
        private String name;

        public Person(String name) {
            this.name = name;
            mother = father = null;
            children = new ArrayList<Person>();
        }

        /**
         * Link together all members of a family.
         *
         * @param pa the father
         * @param ma the mother
         * @param kids the children
         */
        public static void linkFamily(Person pa,
                Person ma,
                Person[] kids) {
            for (Person kid : kids) {
                pa.children.add(kid);
                ma.children.add(kid);
                kid.father = pa;
                kid.mother = ma;
            }
        }

/// getter methods ///////////////////////////////////
        public String toString() {
            return name;
        }

        public String getName() {
            return name;
        }

        public Person getFather() {
            return father;
        }

        public Person getMother() {
            return mother;
        }

        public int getChildCount() {
            return children.size();
        }

        public Person getChildAt(int i) {
            return (Person) children.get(i);
        }

        public int getIndexOfChild(Person kid) {
            return children.indexOf(kid);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JXTreeTable 中的复选框 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐