Java 将JTable值保存到数组
我在下面写了一个独立的例子,除了一件事之外,它的工作方式和我想要的差不多。目前,如果用户单击一个Ellipse2D,它将高亮显示JTable中的一个单元格,并允许他们输入字符串。问题是,当您关闭程序时,它不会将值保存到对象[]数据 如何将输入保存到Object[][]数据,以便下次运行应用程序时它会出现Java 将JTable值保存到数组,java,arrays,swing,jtable,Java,Arrays,Swing,Jtable,我在下面写了一个独立的例子,除了一件事之外,它的工作方式和我想要的差不多。目前,如果用户单击一个Ellipse2D,它将高亮显示JTable中的一个单元格,并允许他们输入字符串。问题是,当您关闭程序时,它不会将值保存到对象[]数据 如何将输入保存到Object[][]数据,以便下次运行应用程序时它会出现 import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class SelfContainedExample extends JPanel implements MouseListener {
private Map<Ellipse2D.Double, Point> shapesMap = new HashMap<>();
private Ellipse2D.Double[] ellipses = new Ellipse2D.Double[] {
new Ellipse2D.Double(50, 100, 30, 30),
new Ellipse2D.Double(175, 100, 30, 30),
new Ellipse2D.Double(300, 100, 30, 30),
new Ellipse2D.Double(50, 160, 30, 30),
new Ellipse2D.Double(175, 160, 30, 30),
new Ellipse2D.Double(300, 160, 30, 30)};
static Object[][] data = {{"1_1", "1_2", "1_3"},
{"2_1", "2_2", "2_3"},
{"3_1", "2_2", "2_3"},
{"4_1", "2_2", "2_3"},
{"5_1", "2_2", "2_3"},
{"6_1", "2_2", "2_3"}};
static Object[] columnNames = {"1", "2", "3"};
static JTable jtable = new JTable(data, columnNames);
public static void main(String[] args)
{
EventQueue.invokeLater(() -> createAndShowGUI());
}
public SelfContainedExample() {
int row = 0;
int column = 0;
for (Ellipse2D.Double ellipse : ellipses) {
shapesMap.put(ellipse, new Point(row, column));
row++;
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
g2d.setColor(Color.BLACK);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (Ellipse2D ellipse : ellipses) {
g2d.fill(ellipse);
}
g2d.setStroke(new BasicStroke(3));
g2d.setColor(Color.GRAY);
for (Ellipse2D ellipse : ellipses) {
g2d.draw(ellipse);
}
addMouseListener(this);
g2d.dispose();
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("Example");
JPanel panel = new JPanel();
JPanel tablePanel = new JPanel();
JScrollPane jScrollPane = new JScrollPane(jtable);
jScrollPane.setPreferredSize(new Dimension(385, 119));
tablePanel.add(jScrollPane);
tablePanel.setSize(200, 200);
panel.setLayout(new BorderLayout());
panel.add(new SelfContainedExample(), BorderLayout.CENTER);
panel.add(tablePanel, BorderLayout.SOUTH);
panel.setOpaque(true);
panel.setVisible(true);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLocationByPlatform(false);
frame.setLocationRelativeTo(null);
frame.setContentPane(panel);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
for (Ellipse2D.Double ellipse : ellipses) {
if (ellipse.contains(e.getPoint())) {
jtable.requestFocusInWindow();
Point p = shapesMap.get(ellipse);
jtable.editCellAt(p.x, p.y);
break;
}
}
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
import java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.geom.*;
导入java.util.*;
导入javax.swing.*;
公共类SelfContainedExample扩展JPanel实现MouseListener{
私有映射shapemap=newhashmap();
私有Ellipse2D.Double[]椭圆=新的Ellipse2D.Double[]{
新的Ellipse2D.双(50100,30,30),
新的Ellipse2D.双色(175100,30,30),
新的Ellipse2D双色(3001003030),
新的Ellipse2D.双(50,160,30,30),
新的Ellipse2D.双(175、160、30、30),
新的Ellipse2D.Double(300,160,30,30)};
静态对象[][]数据={{“1_1”、“1_2”、“1_3”},
{"2_1", "2_2", "2_3"},
{"3_1", "2_2", "2_3"},
{"4_1", "2_2", "2_3"},
{"5_1", "2_2", "2_3"},
{"6_1", "2_2", "2_3"}};
静态对象[]columnNames={“1”、“2”、“3”};
静态JTable JTable=新的JTable(数据、列名);
公共静态void main(字符串[]args)
{
invokeLater(()->createAndShowGUI());
}
公共SelfContainedExample(){
int行=0;
int列=0;
for(椭圆2d.双椭圆:椭圆){
形状映射放置(椭圆,新点(行,列));
行++;
}
}
@凌驾
受保护组件(图形g)
{
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
g2d.setColor(Color.BLACK);
g2d.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
对于(椭圆E2D椭圆:椭圆){
g2d.填充(椭圆);
}
g2d.设定行程(新基本行程(3));
g2d.setColor(Color.GRAY);
对于(椭圆E2D椭圆:椭圆){
g2d.绘制(椭圆);
}
addMouseListener(这个);
g2d.dispose();
}
私有静态void createAndShowGUI()
{
JFrame=新JFrame(“示例”);
JPanel面板=新的JPanel();
JPanel tablePanel=新的JPanel();
JScrollPane JScrollPane=新的JScrollPane(jtable);
setPreferredSize(新维度(385119));
tablePanel.add(jScrollPane);
桌面面板。设置尺寸(200200);
panel.setLayout(新的BorderLayout());
panel.add(新的SelfContainedExample(),BorderLayout.CENTER);
panel.add(tablePanel,BorderLayout.SOUTH);
panel.set不透明(true);
面板设置可见(真);
框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400400);
frame.setLocationByPlatform(假);
frame.setLocationRelativeTo(空);
frame.setContentPane(面板);
frame.setVisible(true);
}
@凌驾
公共无效mouseClicked(MouseEvent e){
}
公共无效鼠标按下(MouseEvent e){
for(椭圆2d.双椭圆:椭圆){
if(eliple.contains(e.getPoint())){
jtable.requestFocusInWindow();
点p=形状映射获取(椭圆);
jtable.editCellAt(p.x,p.y);
打破
}
}
}
@凌驾
公共无效MouseEvent e{}
@凌驾
公共无效mouseenterned(MouseEvent e){}
@凌驾
公共无效mouseExited(MouseEvent e){}
}
这与JTables或Swing无关,而与数据的Java持久性有关,仅此而已。查看此内容,您将发现大量可能的解决方案,包括序列化、写入文件、数据库…@hovercraftfullofels谢谢。注意,我发现您的代码中存在一个大问题,您似乎在paintComponent方法中添加了鼠标侦听器--千万不要这样做,除非您希望GUI有很多鼠标侦听器,许多鼠标侦听器无法控制地添加。我脑海中唯一与Swing相关的问题将围绕事件——什么事件应该触发正在保存的数据?保存按钮ActionListener?关窗事件?程序运行时间歇保存数据的计时器?另一个与Swing相关的问题是注意所有文件I/O都要在Swing事件线程的线程背景上完成。@HovercraftFullOfEels实际上我喜欢计时器间歇保存数据的想法。这是我将采取的办法。