Как добавить JTable в JTabbedPane в Java - PullRequest
0 голосов
/ 08 мая 2019

У меня есть настольное приложение java, которое в основном читает отлично с apache poi (xls, xlsx), а также с BufferedReader для csv, мне удается получить первый лист из отрядов и нарисовать его на JTable и передать его в глобальныйЗатем JPanel пользователь изменяет JTable и генерирует новый файл Excel, каждый раз, когда пользователь загружает Excel, JTable переделывается, а также перерисовывается, проблема в том, что в Excel теперь может быть больше 1 листа, поэтому мне нужно нарисовать несколько JTable для каждоголист и отображение каждой таблицы на отдельной вкладке, я начал с изучения того, как добавить на каждую вкладку JTable, но я не в состоянии это сделать, так как моя программа работает с 1 глобальным JPanel, глобальным JTable и глобальным JScrollPane,У меня есть 3 метода, 1 для создания таблицы, когда ее XLS, еще 1 для создания таблицы для XLSX и, наконец, 1 для создания таблицы для CSV, в этих методах я удаляю все из моей JPanel и добавляю глобальную таблицу, измененную для этой JPanel, этоработает отлично, но теперь, когда у меня есть этот реквизит пря думаю, что использование их как глобальных не позволит мне сделать это или нет?

Я попытался использовать глобальную JTabbedPane, в которой сейчас я добавляю вкладку, содержащую JTable, каждый раз, когда пользователь загружает файл Excel, но это не работает, я пытаюсь создать новый JPanel локально в методе, затем передать ему новый JTable, затем передать этот JPanel в JTabbedPane с помощью метода add (), затем передать этот JTabbedPane моему глобальному JPanel, но этоне будет работать так, как я ожидал.

У меня есть этот класс, который мне помогает партнер, потому что у меня были проблемы с настройкой фона изображения, поэтому мне пришлось использовать его, так же, как JPanel, только с этимметод для установки фона, у меня также есть метод, который я использую для чтения файла свойств, который у меня есть внутри JAR, когда я делаю Maven Build, но уместным в этом классе является то, что я использую фон изображения, потому что я не могне делаю это другими способами.

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 является основным классом, извините, если я вас смущаю, я открыт для любой помощи или ориентации.

...