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