访问包含JTable的JScrollPane

5

我有一个在JScrollPane中的JTable。我无法访问JScrollPane变量,但是我可以访问JTable。现在如何使用JTable访问JScrollPane。

For Example -> mytable.getAncestor(...) or something?

无论你在谈什么,你都可以从任何角落访问当前JVM中的任何对象,问题是关于两个踩票而不是赞票。 - mKorbel
从JScrollPane只被指定为嵌套一个对象开始 - mKorbel
@mKorbel 那么我应该如何从那个“一个对象”,也就是jTable中获取它呢? - Deval Khandelwal
有三种方法:1. 将JScrollPane定义为局部变量,2. 使用SwingUtilities的parent/ancesor,3. 测试parent(如@Oleg Estekhin所示的答案)。 - mKorbel
@mKorbel,Oleg的代码不起作用。我只能使用SwingUtilities。但是找不到要使用哪个方法...即JscrollPane pane = SwingUtilities.?? - Deval Khandelwal
默认情况下,您只需要从Mouse/MouseInfo指向一个点,这里有几个类似的问题(我打赌是关于JTabbedPane的),再次正确的方法是将JScrollPane定义为局部变量。 - mKorbel
2个回答

6
如果您想从JTable中获取JScrollPane,请使用以下方法:
JTable jTable = new JTable(rowData, colData);
JScrollPane scrollPane = new JScrollPane(jTable);
// now you have the ViewPort
JViewport parent = (JViewport)jTable.getParent();
JScrollPane enclosing = (JScrollPane)parent.getParent();

尝试下面的代码...

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 *
 * @author Patrick Ott <Patrick.Ott@professional-webworkx.de>
 * @version 1.0
 */
public class MainFrame extends JFrame {

    private String[][] rowData = 
    {
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Max", "Mustermann", "Musterhausen"},
        {"Petra", "Mustermann", "Musterhausen"}
    };

    private String[] columnData = 
    {
        "Firstname", "Lastname", "City"
    };
    private JTable jTable;

    public MainFrame() {
        jTable = new JTable(rowData, columnData);
        jTable.setName("CRM Table");
    }

    public void createAndShowGui() {
        this.setTitle("JTable in JScrollPane");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.getContentPane().add(new JLabel("CRM System"), BorderLayout.NORTH);
        JScrollPane scrollPane = new JScrollPane(jTable);
        this.getContentPane().add(scrollPane, BorderLayout.CENTER);
        this.setSize(new Dimension(1024, 768));
        this.setVisible(true);
        Container parent = jTable.getParent().getParent();
        JScrollPane enclosing = (JScrollPane)parent;
        parent.remove(jTable);
        parent.add(new JLabel("Test"));
        // System.out.println(enclosing.getClass().getSimpleName());
    }
}

帕特里克。

3
假设JTable通常被放置在JScrollPane中:
假设JTable通常被放置在JScrollPane中:
JTable table = ...;
JScrollPane scrollPane = new JScrollPane(table);

您可以通过使用getParent()获取视口并在视口上使用getParent()来获取包装表格的滚动窗格。

JScrollPane enclosingScrollPane = (JScrollPane) table.getParent().getParent()

最坏的情况是,如果您不确定表格是否在滚动窗格内部,您将不得不在转换之前检查表格父组件的 instanceof。


代码不起作用... :( 错误为-> javax.swing.JViewport 无法转换为 javax.swing.JScrollPane - Deval Khandelwal
抱歉,我忘记了视口。只需使用table.getParent().getParent()来获取滚动窗格。我会更新答案。 - Oleg Estekhin
抱歉,但是Patrick比你更早地给出了正确答案。所以这个勾号归他了。 - Deval Khandelwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接