Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 多表单选_Java_Swing_Jtable - Fatal编程技术网

Java 多表单选

Java 多表单选,java,swing,jtable,Java,Swing,Jtable,我正在开发一个应用程序,它利用一组JTables,每个JTables由不同的数据模型(例如,每个表中的不同对象)支持。用例要求表集具有多个排除范围(即,在任何给定点,每组表最多可以选择1行) JDK按钮组为一组抽象按钮实现此功能。有人见过表的类似实现吗?如果不是,这是最好的方法吗?也许有一种更好的设计模式/习惯用法。您必须自己动手,但这可以通过使用自定义ListSelectionListener来实现。类似这样的方法可能会奏效: @Override public void valueChange

我正在开发一个应用程序,它利用一组JTables,每个JTables由不同的数据模型(例如,每个表中的不同对象)支持。用例要求表集具有多个排除范围(即,在任何给定点,每组表最多可以选择1行)


JDK按钮组为一组抽象按钮实现此功能。有人见过表的类似实现吗?如果不是,这是最好的方法吗?也许有一种更好的设计模式/习惯用法。

您必须自己动手,但这可以通过使用自定义ListSelectionListener来实现。类似这样的方法可能会奏效:

@Override
public void valueChanged(ListSelectionEvent e) {
    ListSelectionModel selectedModel = (ListSelectionModel) e.getSource();
    for (ListSelectionModel model : models) {
        if (model != selectedModel) {
            model.removeListSelectionListener(this);
            model.clearSelection();
            model.addListSelectionListener(this);
        }
    }
}   
其中models是一个ArrayList,它保存所有JTable的ListSelectionModels

例如:

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class ListSelectionListenerExample extends JPanel {
    private static final int TABLE_COUNT = 4;
    private static final Integer[][] DATA = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    private static final String[] COL_NAMES = {"A", "B", "C"};

    public ListSelectionListenerExample() {
        ListSelectionGroup listSelectionGroup = new ListSelectionGroup();
        setLayout(new GridLayout(1, 0));
        for (int i = 0; i < TABLE_COUNT; i++) {
            DefaultTableModel model = new DefaultTableModel(DATA, COL_NAMES);
            JTable table = new JTable(model);
            ListSelectionModel selectionModel = table.getSelectionModel();
            listSelectionGroup.register(selectionModel);
            add(new JScrollPane(table));
        }
    }

    private static void createAndShowGui() {
        ListSelectionListenerExample mainPanel = new ListSelectionListenerExample();

        JFrame frame = new JFrame("ListSelectionListener Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.ListSelectionModel;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
@抑制警告(“串行”)
公共类ListSelectionListenerExample扩展了JPanel{
私有静态最终整数表_计数=4;
私有静态最终整数[][]数据={{1,2,3},{4,5,6},{7,8,9};
私有静态最终字符串[]COL_NAMES={“A”、“B”、“C”};
public ListSelectionListenerExample(){
ListSelectionGroup ListSelectionGroup=新建ListSelectionGroup();
setLayout(新的GridLayout(1,0));
对于(int i=0;icreateAndShowGui());
}
}

import java.util.ArrayList;
导入java.util.List;
导入javax.swing.ListSelectionModel;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类ListSelectionGroup{
私有列表模型=新的ArrayList();
私有MyListener MyListener=新MyListener();
公共作废登记簿(ListSelectionModel){
模型。添加(模型);
model.addListSelectionListener(myListener);
}
//过载法
公共无效寄存器(JTable表){
寄存器(table.getSelectionModel());
}
//创建一个私有的内部类,这样我们就不会意外地将其添加到
//ListSelectionModel而不经过register方法
私有类MyListener实现ListSelectionListener{
@凌驾
public void值已更改(ListSelectionEvent e){
ListSelectionModel selectedModel=(ListSelectionModel)e.getSource();
用于(ListSelectionModel:models){
如果(型号!=所选型号){
model.removeListSelectionListener(此);
model.clearSelection();
model.addListSelectionListener(此);
}
}
}
}
}

我认为您必须自己编写代码,我打赌您会很容易地解决这个问题。我没有这样做,但您可能希望使用所有JTable共享的自定义选择模型。不,不是自定义选择模型,但我们需要的是一个定制的、共享的
ListSelectionListener
,它已经实现并开始工作。简单而优雅+SCCE为1。
import java.util.ArrayList;
import java.util.List;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListSelectionGroup {

    private List<ListSelectionModel> models = new ArrayList<>();
    private MyListener myListener = new MyListener();

    public void register(ListSelectionModel model) {
        models.add(model);
        model.addListSelectionListener(myListener);
    }

    // overload method for convenience
    public void register(JTable table) {
        register(table.getSelectionModel());
    }

    // make a private inner class so that we don't accidentally add this to a 
    // ListSelectionModel without going through the register method
    private class MyListener implements ListSelectionListener {

        @Override
        public void valueChanged(ListSelectionEvent e) {
            ListSelectionModel selectedModel = (ListSelectionModel) e.getSource();
            for (ListSelectionModel model : models) {
                if (model != selectedModel) {
                    model.removeListSelectionListener(this);
                    model.clearSelection();
                    model.addListSelectionListener(this);
                }
            }
        }
    }
}