gpt4 book ai didi

java - 基于Windows的应用程序通过JAVA中的变量访问对象

转载 作者:行者123 更新时间:2023-12-02 08:46:46 28 4
gpt4 key购买 nike

因此,我正在开发一个基于 GUI 的应用程序,该应用程序使用 Apache POI 从 Excel 读取数据,并使用基于 JAVA AWT/SWING 的 Window 应用程序显示数据。因此,首先我将 Apache POI 集成到基于 GUIJAVA 项目中。

所以,现在我尝试从 Excel 访问特定的单元格数据并在 GUI 应用程序中打印它。我已经整理了如何从 excel 到 Java 获取特定单元格数据以及如何使用 Jlabel。要继续,我需要将单元格数据发送到 JLabel

我已执行以下操作来获取 Cell 数据:显然,我们有来自 Cell 类的 cell 对象。如何将此 cell 数据发送到 JLabel

我有以下 JLabel 代码。

try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx")) {  
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(2);
if (cell != null)
System.out.println("Data: "+cell);
else
System.out.println("Cell is empty");
}catch(Exception e) {
System.out.println(e);
}

显然我们有来自 Cell 类的 cell 对象。如何将此 cell 数据发送到 JLable

我有以下 JLable 代码。

按下按钮后,Lable 的内容会发生变化。


lblNewLabel = new JLabel("Hey there. Your GPA is");
lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));
lblNewLabel.setBounds(100, 46, 298, 55);
frame.getContentPane().add(lblNewLabel);


JButton btnNewButton = new JButton("Show me!");
btnNewButton.setForeground(Color.BLUE);
btnNewButton.setFont(new Font("Microsoft YaHei UI", Font.BOLD, 16));
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "Hello World!");
lblNewLabel.setText(cell);
}
});

lblNewLabel.setText(cell);

但是显示错误。我什至声明了一个新字符串并使用 cell 对象传递它。但也没有成功。

我正在寻找一种将输出从 Cell 传递到 JLabel 的方法。

两者都只在主函数中。

下面是完整的代码。

package com;

import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextField;
import javax.swing.JLabel;

public class GUI {

private JFrame frame;
private JLabel lblNewLabel;
private JTextField textField;
private JTextField textField_1;
private JLabel lblNewLabel_1;
private JTextField textField_2;
/**
* Launch the application.
*/
public static void main(String[] args) {
try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx")) {
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(2);
if (cell != null)
System.out.println("Data: "+cell);
else
System.out.println("Cell is empty");
}catch(Exception e) {
System.out.println(e);
}


EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI window = new GUI();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public GUI() {
initialize();
}

/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 605, 418);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton btnNewButton = new JButton("Show me!");
btnNewButton.setForeground(Color.BLUE);
btnNewButton.setFont(new Font("Microsoft YaHei UI", Font.BOLD, 16));
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "Hello World!");
lblNewLabel.setText(cell);
}
});
btnNewButton.setBounds(147, 133, 130, 31);
frame.getContentPane().add(btnNewButton);

lblNewLabel = new JLabel("Hey there. Your GPA is");
lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));
lblNewLabel.setBounds(100, 46, 298, 55);
frame.getContentPane().add(lblNewLabel);

textField = new JTextField();
textField.setBounds(63, 214, 96, 19);
frame.getContentPane().add(textField);
textField.setColumns(10);

textField_1 = new JTextField();
textField_1.setBounds(342, 214, 96, 19);
frame.getContentPane().add(textField_1);
textField_1.setColumns(10);

lblNewLabel_1 = new JLabel("Answer-");
lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 24));
lblNewLabel_1.setBounds(139, 323, 122, 48);
frame.getContentPane().add(lblNewLabel_1);

textField_2 = new JTextField();
textField_2.setBounds(301, 329, 174, 42);
frame.getContentPane().add(textField_2);
textField_2.setColumns(10);

JButton btnNewButton_1 = new JButton("Multiply");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int a,b,ans;
try {
a=Integer.parseInt(textField.getText());
b=Integer.parseInt(textField_1.getText());
ans=a*b;
textField_2.setText(Integer.toString(ans));

}catch(Exception e1) {
JOptionPane.showMessageDialog(null,"Enter valid number");
}
}
});
btnNewButton_1.setBounds(90, 264, 85, 21);
frame.getContentPane().add(btnNewButton_1);

JButton btnNewButton_2 = new JButton("Divide");
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int a,b,ans;
try {
a=Integer.parseInt(textField.getText());
b=Integer.parseInt(textField_1.getText());
ans=a/b;
textField_2.setText(Integer.toString(ans));

}catch(Exception e2) {
JOptionPane.showMessageDialog(null,"Enter valid number");
}
}
});

btnNewButton_2.setBounds(330, 264, 85, 21);
frame.getContentPane().add(btnNewButton_2);
}
}

不要介意所有其他 GUI 代码。它们只是一些按钮、文本字段。

最佳答案

首先您需要获取Cell cellinitialize 的范围内方法或 Cell cell必须是类成员 JLabel lblNewLabel也是。

另一个解决方案是使用公共(public)方法从工作簿中获取单元格内容,然后可以从 initialize 中调用该方法。方法。

然后,setText方法JLabel需要 String作为参数。所以你需要转换 cell 的内容至String .

最简单的解决方案是

...
String cellContent = cell.toString();
...

但这不是首选方法。相反,使用 DataFormatterapache poiCell 中获取单元格内容作为StringDataFormatter会得到StringExcel 相同显示单元格内容。

...
DataFormatter formatter = new DataFormatter();
...
String cellContent = formatter.formatCellValue(cell);
...

如果可以有公式单元格并且您需要公式结果而不是公式,那么您将需要 FormulaEvaluator另外。

...
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
...
String cellContent = formatter.formatCellValue(cell, evaluator);
...

因此,要扩展您的代码,您可以使用以下方法:

...
public String getCellContent() {
String cellContent = "";
try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx");
Workbook wb = WorkbookFactory.create(inp)) {
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = null;
if (row != null) cell = row.getCell(2);
cellContent = formatter.formatCellValue(cell, evaluator);
} catch (Exception e) {
e.printStackTrace();
}
return cellContent;
}
...

然后在你的 initialize 中方法:

...
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "Hello World!");
lblNewLabel.setText(getCellContent());
}
...

但是当然,这总是会从工作表中获得相同的单元格内容。因此,对于实际使用来说 getCellContent必须有参数来告诉应读取哪个具体单元格。然后,该方法不应在每次获取单元格内容时打开工作簿。所以Workbook wb , DataFormatter formatterFormulaEvaluator evaluator应该是类成员并且仅创建一次,而 initialize .

关于java - 基于Windows的应用程序通过JAVA中的变量访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61029110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com