如何使用Java将JTable添加到JTabbedPane

时间:2019-05-08 15:38:52

标签: java swing jtable jtabbedpane

我有一个Java桌面应用程序,该应用程序基本上使用apache poi(xls,xlsx)以及CSV的BufferedReader读取excel,我设法获得了excel的第一张表并将其绘制在JTable上并传递给全局JPanel然后用户修改JTable并生成一个新的excel文件,每次用户加载一个excel时,JTable都将重新制作并重新绘制,问题是excel现在可以有多个工作表,因此我需要为每个表绘制多个JTable工作表并在不同的选项卡上显示每个表,我首先学习如何在每个选项卡上添加JTable,但我无法执行此操作,我的程序的工作方式是使用1个全局JPanel,一个全局JTable和全局JScrollPane,我有3种方法,一种用于在xlsx上创建表,另一种用于xlsx上创建表,最后一种用于csv上创建表,在这些方法中,我从JPanel中删除了所有内容,并将修改后的全局表添加到此JPanel中,效果很好,但是现在我有了打印的需求我认为将这些表格设置为全局表格不会让我这么做吗?还是会呢?

我尝试使用全局JTabbedPane,现在,每次用户加载excel文件时,我都会在其中添加一个包含JTable的选项卡,但它不起作用,我尝试在该方法中本地创建一个新的JPanel,然后将其传递给新的JTable,然后使用add()方法将此JPanel传递给JTabbedPane,然后将此JTabbedPane传递给我的全局JPanel,但是它不能按我预期的那样工作。

我有一个类,这个类是合作​​伙伴帮助我实现的,因为我在设置图像背景时遇到了麻烦,所以我不得不使用它,它与JPanel相同,只是通过该方法来设置背景,我也有一个方法在那里,当我执行Maven Build时,我用它来读取JAR内的属性文件,但此类中的相关之处在于,我使用它来具有图像背景,因为我无法通过其他方法来做到这一点。

public class ImagePanel extends JPanel {
    // Atributo que guardara la imagen de Background que le pasemos.
    private ImageIcon background;
    private File file;

    // Metodo que es llamado automaticamente por la maquina virtual Java cada vez
    // que repinta
    public void paintComponent(Graphics g) {

        /*
         * Obtenemos el tamano del panel para hacer que se ajuste a este cada vez que
         * redimensionemos la ventana y se lo pasamos al drawImage
         */
        int width = this.getSize().width;
        int height = this.getSize().height;

        // Mandamos que pinte la imagen en el panel
        if (this.background != null) {
            g.drawImage(this.background.getImage(), 0, 0, width, height, null);

        }

        super.paintComponent(g);
    }

    // Metodo donde le pasaremos la dirección de la imagen a cargar.
    public void pintar(String imagePath) {

        // Construimos la imagen y se la asignamos al atributo background.
        this.setOpaque(false);

        // this.background = new ImageIcon(imagePath).getImage();

        this.background = new ImageIcon(getClass().getResource(imagePath));
        System.out.println("Esta es la ruta de la  imagen : " + getClass().getResource(imagePath));

        repaint();
    }

    public Properties devolverProperties() throws IOException {

        Properties properties = new Properties();
        ClassLoader cl = this.getClass().getClassLoader();
        InputStream stream = cl.getResourceAsStream("configuracion.properties");
        properties.load(stream);
        stream.close();
        return properties;

    }

    /*
     * public static void main(String[] args) { ImagePanel ima = new ImagePanel();
     * System.out.println(ima.devolverFile("/img/configuracion.properties")); }
     */
}

然后在我称为InterfazPrincipal的主类中,执行以下操作:

public class InterfazPrincipal extends javax.swing.JFrame {
ImagePanel image = new ImagePanel();

JLabel nombreFile = new JLabel("No se ha seleccionado ningun archivo");

Font fuente = new Font("Courier", Font.BOLD, 12);

JScrollPane scrollsilloGlobal = new JScrollPane();

JTable tablaGlobal = new JTable();

JTabbedPane pestanas = new JTabbedPane();

构造函数:

public InterfazPrincipal() throws IOException {

        // Seteamos titulo y tamano
        setTitle("Aplicacion Excels");
        setSize(500, 500);
        // No se puede cambiar el tamano de la pantalla en ejecucion
        setResizable(false);
        // coloca la ventana en una posición relativa a un componente que le pasemos
        // como parametro. Pero si le pasamos null como parametro,
        // coloca a la ventana en el centro de la pantalla.
        setLocationRelativeTo(null);
        // Posicionamiento absoluto.
        setLayout(null);
        // Salir al cerrar la app.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Pasamos la ruta de la imagen
        image.pintar("/img/fondoEmp.png");
        // Seteamos posicion en que se despliega el frame y si ancho y alto
        image.setBounds(0, 0, 500, 500);
        image.setLayout(null);

        labels();
        botones();
        this.add(image);
        setVisible(true);
    }

然后,在阅读xls并准备好表之后,在我的方法中,我想将其添加到选项卡和这样的界面中:

tablaGlobal.setModel(model);
tablaGlobal.setBackground(Color.GRAY.darker());
tablaGlobal.setForeground(Color.WHITE);
tablaGlobal.setAutoCreateRowSorter(true);
scrollsilloGlobal.getViewport().add(tablaGlobal,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollsilloGlobal.setBounds(65, 130, 385, 120);
ImagePanel panel1=new ImagePanel();
panel1.add(scrollsilloGlobal);
panel1.setBounds(65, 130, 385, 160);
pestanas.add("First Table", panel1);
pestanas.setBounds(65, 130, 385, 160);
image.add(pestanas);

但是它不起作用,它添加了它,但是我必须单击表的左侧以显示选项卡,如果我尝试添加另一个选项卡,它将覆盖该选项卡。

实际结果:显示表格时不显示选项卡,直到我单击表格的左上角为止,如果我尝试添加更多选项卡,它将覆盖该选项卡。 预期结果:添加多个选项卡,每个选项卡上都有一个JTable。

我已经搜索了有关如何执行此操作的信息,我正在尝试像这样(https://examples.javacodegeeks.com/desktop-java/swing/jtabbedpane/create-jtabbedpane-example/)起作用,但没有达到预期的效果,我认为我的问题是我没有使用JFrame,仅使用JPanel才使用了我的JFrame上课,对不起,如果我对任何帮助或方向都感到困惑,我会感到抱歉。

0 个答案:

没有答案