Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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/2/ssis/2.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特定列的所有行(以呈现JTextPane)_Java_Swing_Jtable_Jtextpane_Renderer - Fatal编程技术网

Java 跨越JTable特定列的所有行(以呈现JTextPane)

Java 跨越JTable特定列的所有行(以呈现JTextPane),java,swing,jtable,jtextpane,renderer,Java,Swing,Jtable,Jtextpane,Renderer,我想构建一个标准的JTable,但是所有行都跨在一个特定的列上。因此,该列只能包含一个以JTextPane作为其呈现程序的单元格。 你知道简单的方法吗 注意:不需要第三方软件 谢谢。一个JTable的呈现,包括对单元格矩形的剪裁,深深地隐藏在可插拔外观的内部。在那里更改内容将是一项混乱的业务,并且高度依赖于实际的JFC实现 因此,我建议你用任何你喜欢的方式画这些ROE的单元格,并在表的顶部放一个透明的窗格,用你描述的内容覆盖这些区域。仍然很凌乱,可能需要做很多工作,但更可能是可移植的。一个JTa

我想构建一个标准的JTable,但是所有行都跨在一个特定的列上。因此,该列只能包含一个以JTextPane作为其呈现程序的单元格。 你知道简单的方法吗

注意:不需要第三方软件


谢谢。

一个
JTable
的呈现,包括对单元格矩形的剪裁,深深地隐藏在可插拔外观的内部。在那里更改内容将是一项混乱的业务,并且高度依赖于实际的JFC实现


因此,我建议你用任何你喜欢的方式画这些ROE的单元格,并在表的顶部放一个透明的窗格,用你描述的内容覆盖这些区域。仍然很凌乱,可能需要做很多工作,但更可能是可移植的。

一个
JTable
的呈现,包括对单元格矩形的剪裁,深入到了可插拔外观的内部。在那里更改内容将是一项混乱的业务,并且高度依赖于实际的JFC实现


因此,我建议你用任何你喜欢的方式画这些ROE的单元格,并在表的顶部放一个透明的窗格,用你描述的内容覆盖这些区域。仍然很混乱,可能需要做很多工作,但更可能是可移植的。

由@MvG的某种叠加思想触发,这里有一个使用JLayer的概念证明(添加到jdk7的核心,对于早期版本,使用非常类似)

基本成分:

  • 在其玻璃窗格中管理文本区域的图层
  • 自定义layoutManager,用于调整/定位列上的文本区域
  • 一些侦听器强制重新布局玻璃窗格
令人惊讶的是,至少要让它工作起来很简单。但也有一些粗糙的边缘:

  • 一如既往,表中的导航:当表具有焦点时,其单元格选择将移动到textArea下。可能需要自定义selectionModel
  • 在移动列的过程中,列下的表行可见
  • ???可能是另一群魔鬼,毕竟我们把ui弄糊涂了:-)
一些代码:

public static class RowSpanUI extends LayerUI<JTable> {
    public static String COLUMN_TO_SPAN_KEY = "Table.columnToSpan";
    private JLayer layer;
    private JTextArea area;

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        this.layer = (JLayer) c;
        installTextArea();
        installListeners();
    }


    @Override
    public void doLayout(JLayer<? extends JTable> l) {
        super.doLayout(l);
        l.getGlassPane().doLayout();
    }

     private void installTextArea() {
        area = new JTextArea(10, 20);
        layer.getGlassPane().setBorder(BorderFactory.createLineBorder(Color.RED));
        layer.getGlassPane().setLayout(new ColumnLayoutManager(this));
        layer.getGlassPane().add(area);
        layer.getGlassPane().setVisible(true);
    }

    public JTable getView() {
        return (JTable) layer.getView();
    }

    public int getViewColumnToSpan() {
        Object clientProperty = getView().getClientProperty(COLUMN_TO_SPAN_KEY);
        if (clientProperty instanceof Integer) {
            return getView().convertColumnIndexToView((int) clientProperty);
        }   
        return -1;
    }

    /**
     * Install listeners to manually trigger a layout of the glassPane.
     * This is incomplete, just the minimum for demonstration!
     */
    protected void installListeners() {
        ComponentListener compL = new ComponentListener() {

            @Override
            public void componentShown(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentResized(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentHidden(ComponentEvent e) {
                // TODO Auto-generated method stub

            }
        };
        layer.addComponentListener(compL);

        TableColumnModelListener columnL = new TableColumnModelListener() {

            @Override
            public void columnRemoved(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnMoved(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnMarginChanged(ChangeEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnAdded(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnSelectionChanged(ListSelectionEvent e) {
            }

        };
        getView().getColumnModel().addColumnModelListener(columnL);
    }

}

public static class ColumnLayoutManager implements LayoutManager {

    private RowSpanUI ui;

    public ColumnLayoutManager(RowSpanUI ui) {
        this.ui = ui;
    }

    @Override
    public void layoutContainer(Container parent) {
        Component child = parent.getComponent(0);
        child.setBounds(getColumnBounds());
    }

    @Override
    public Dimension preferredLayoutSize(Container parent) {
        return ui.getView().getSize();
    }

    protected Rectangle getColumnBounds() {
        int viewColumn = ui.getViewColumnToSpan();
        if (viewColumn < 0) {
            return new Rectangle();
        }
        Rectangle r = ui.getView().getCellRect(0, viewColumn, false);
        r.height = ui.getView().getHeight();
        return r;
    }

    @Override
    public Dimension minimumLayoutSize(Container parent) {
        return preferredLayoutSize(parent);
    }
    @Override
    public void addLayoutComponent(String name, Component comp) {
    }

    @Override
    public void removeLayoutComponent(Component comp) {
    }
}

// usage
JTable table = new JTable(myModel);
table.putClientProperty(RowSpanUI.COLUMN_TO_SPAN_KEY, 2);
JLayer layer = new JLayer(table, new RowSpanUI());
公共静态类RowSpanUI扩展了{
公共静态字符串COLUMN\u TO\u SPAN\u KEY=“Table.columnToSpan”;
私有层;
私人住宅区;
@凌驾
public void installUI(JComponent c){
super.installUI(c);
this.layer=(JLayer)c;
installTextArea();
installListeners();
}
@凌驾

public void doLayout(JLayer由@MvG某种覆盖的想法触发这里有一个使用JLayer的概念证明(添加到jdk7的核心,对于早期版本,使用非常类似)

基本成分:

  • 在其玻璃窗格中管理文本区域的图层
  • 自定义layoutManager,用于调整/定位列上的文本区域
  • 一些侦听器强制重新布局玻璃窗格
令人惊讶的是,至少要让它工作起来很简单。尽管有一些粗糙的边缘:

  • 和往常一样,表中的导航:当表有焦点时,其单元格选择将移动到textArea下。可能需要自定义selectionModel
  • 在移动列的过程中,列下的表行可见
  • ??也许是另一群魔鬼,毕竟我们把ui弄糊涂了:-)
一些代码:

public static class RowSpanUI extends LayerUI<JTable> {
    public static String COLUMN_TO_SPAN_KEY = "Table.columnToSpan";
    private JLayer layer;
    private JTextArea area;

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        this.layer = (JLayer) c;
        installTextArea();
        installListeners();
    }


    @Override
    public void doLayout(JLayer<? extends JTable> l) {
        super.doLayout(l);
        l.getGlassPane().doLayout();
    }

     private void installTextArea() {
        area = new JTextArea(10, 20);
        layer.getGlassPane().setBorder(BorderFactory.createLineBorder(Color.RED));
        layer.getGlassPane().setLayout(new ColumnLayoutManager(this));
        layer.getGlassPane().add(area);
        layer.getGlassPane().setVisible(true);
    }

    public JTable getView() {
        return (JTable) layer.getView();
    }

    public int getViewColumnToSpan() {
        Object clientProperty = getView().getClientProperty(COLUMN_TO_SPAN_KEY);
        if (clientProperty instanceof Integer) {
            return getView().convertColumnIndexToView((int) clientProperty);
        }   
        return -1;
    }

    /**
     * Install listeners to manually trigger a layout of the glassPane.
     * This is incomplete, just the minimum for demonstration!
     */
    protected void installListeners() {
        ComponentListener compL = new ComponentListener() {

            @Override
            public void componentShown(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentResized(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                doLayout(layer);
            }

            @Override
            public void componentHidden(ComponentEvent e) {
                // TODO Auto-generated method stub

            }
        };
        layer.addComponentListener(compL);

        TableColumnModelListener columnL = new TableColumnModelListener() {

            @Override
            public void columnRemoved(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnMoved(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnMarginChanged(ChangeEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnAdded(TableColumnModelEvent e) {
                doLayout(layer);
            }

            @Override
            public void columnSelectionChanged(ListSelectionEvent e) {
            }

        };
        getView().getColumnModel().addColumnModelListener(columnL);
    }

}

public static class ColumnLayoutManager implements LayoutManager {

    private RowSpanUI ui;

    public ColumnLayoutManager(RowSpanUI ui) {
        this.ui = ui;
    }

    @Override
    public void layoutContainer(Container parent) {
        Component child = parent.getComponent(0);
        child.setBounds(getColumnBounds());
    }

    @Override
    public Dimension preferredLayoutSize(Container parent) {
        return ui.getView().getSize();
    }

    protected Rectangle getColumnBounds() {
        int viewColumn = ui.getViewColumnToSpan();
        if (viewColumn < 0) {
            return new Rectangle();
        }
        Rectangle r = ui.getView().getCellRect(0, viewColumn, false);
        r.height = ui.getView().getHeight();
        return r;
    }

    @Override
    public Dimension minimumLayoutSize(Container parent) {
        return preferredLayoutSize(parent);
    }
    @Override
    public void addLayoutComponent(String name, Component comp) {
    }

    @Override
    public void removeLayoutComponent(Component comp) {
    }
}

// usage
JTable table = new JTable(myModel);
table.putClientProperty(RowSpanUI.COLUMN_TO_SPAN_KEY, 2);
JLayer layer = new JLayer(table, new RowSpanUI());
公共静态类RowSpanUI扩展了{
公共静态字符串COLUMN\u TO\u SPAN\u KEY=“Table.columnToSpan”;
私有层;
私人住宅区;
@凌驾
public void installUI(JComponent c){
super.installUI(c);
this.layer=(JLayer)c;
installTextArea();
installListeners();
}
@凌驾

公共空间分配(JLayer@Randy不够好。渲染器是按单元格应用的,不支持跨多个单元格。有一些旧的示例(基本上是对ui委托进行黑客攻击),但没有什么真正令人满意的(没有检查商业广告)在底层模型中,您如何解释这一点。对于特定列,模型中的每一行是否都有相同的数据?是否可以选择在
JTable
@Robin旁边放置一个
JTextPane
。JTextPane中的文档必须由所有行共享。我会根据JTable中的值进行一些修改。我可以把
JTextPane
JTable
分开,但是我想把它放在两个左边的列和三个右边的列之间。你认为我可以把
JTable
分开,把
JTextPane
放在两个部分之间吗?你当然可以把表分开。为
TableModel
w编写一个装饰程序应该不会太难hich采用现有的
表格模型
,仅公开部分columns@Robin,您也可以使用一个
表格模型
并使用来进行过滤。@Randy不够好。.每个单元格都应用渲染器,不支持跨多个单元格。有一些古老的示例(基本上是对ui委托进行黑客攻击),但没有什么真正令人满意的(没有检查广告)在底层模型中,您如何解释这一点。对于特定列,模型中的每一行是否都有相同的数据?是否可以选择在
JTable
@Robin旁边放置一个
JTextPane
。JTextPane中的文档必须由所有行共享。我会根据JTable中的值进行一些修改。我可以把
JTextPane
JTable
分开,但是我想把它放在两个左边的列和三个右边的列之间。你认为我可以把
JTable
分开,把
JTextPane
放在两个部分之间吗?你当然可以把表分开。为
TableModel
w编写一个装饰程序应该不会太难hich take