有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单击按钮后,swing java将数据传递到JTable的行

我正在做一个java应用程序,它必须将一个初始化的字符串数组作为行显示给JTable

这就是我所尝试的:

      Object[] _row1;

      public PrintMeNow() {
            table = new JTable();
    table.setBounds(16, 203, 362, 16);
    table.setShowHorizontalLines(true);
    table.setShowVerticalLines(true);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.setModel(new DefaultTableModel(
        new Object[][] {
                _row1, {2,2,2}, {3,3,3}, {4,4,4}
        },
        new String[] {
            "QTY", "Item Code", "Amount"
        }
    ));

     }

  btnStart.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
           _row1 = new Object[]{"DN Korina", "DN Madrid", "DN Romania"};
      }
  });

但当我按下开始按钮时,它并没有填满这一行。我在这里做错了什么?非常感谢你的帮助。谢谢


共 (2) 个答案

  1. # 1 楼答案

    您需要做的是将一行添加到Model。像这样的

    public void actionPerformed(ActionEvent arg0) {
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[]{"DN Korina", "DN Madrid", "DN Romania"});
    }
    

    最简单的方法是将模型设置为没有行

    String[] colNames = {
           "QTY", "Item Code", "Amount"
    };
    
    DefaultTableModel model = new DefaultTableModel(colNames, 0);  <== 0 rows
    JTable table = new JTable(model);
    

    然后,无论要添加什么行,只需添加到模型中即可

    public void actionPerformed(ActionEvent e){
        model.addRow(new Object[]{"DN Korina", "DN Madrid", "DN Romania"});
    }
    

    更新示例

    import java.awt.*;
    import java.util.Stack;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    
    public class TestTable {
    
        private String[] colNames = { "Col 1", "Col2", "Col3", "Col4", "Col5" };
    
        private DefaultTableModel model = new DefaultTableModel(colNames, 0);
        private JTable table = new JTable(model);
        private MyStack myStack = new MyStack();
        private Stack<Integer[]> stack;
    
        private JButton button = new JButton("Add Row");
    
        public TestTable() {
            stack = myStack.getStack();
    
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (!stack.isEmpty()) {
                        Integer[] array = stack.pop();
                        model.addRow(array);
                    }
                }
            });
    
            JFrame frame = new JFrame();
            frame.add(new JScrollPane(table), BorderLayout.CENTER);
            frame.add(button, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestTable();
                }
            });
        }
    }
    
    class MyStack {
        public Stack<Integer[]> stack = new Stack<Integer[]>();
    
        public MyStack() {
            int k = 1;
            for (int i = 0; i < 20; i++) {
                Integer[] array = new Integer[5];
                for (int j = 0; j < 5; j++) {
                    array[j] = i * k * (j + 1);
                }
                k++;
                stack.push(array);
            }
        }
    
        public Stack<Integer[]> getStack() {
            return stack;
        }
    }
    

    解释

    • 我有一个MyStack类,它有一个Stack。它甚至可以是像数组一样的任何数据结构,但我选择使用Stack,因为我可以.pop()它。然后得到Integer[]
    • 我在GUI类中实例化该类
    • 然后我提取Stack。请记住Stack包含Integer[]
    • 正如我所解释的,您希望向model添加一个一维数组
    • 所以每次我点击这个按钮,一个Integer[]就会从Stack中拉出,然后我就把这个数组作为一行添加到model
  2. # 2 楼答案

    But when I pressed the start button, it's not filling the row. What am I doing wrong in here?

    • 您在ActionListener内的代码缺少任何到addRowJTable或到DefaultTableModeltable.getModel....)的代码。

    • 在您使用DefaultTableModel的情况下,行是添加到JTable还是DefaultTableModel

    • 不要在Swing中使用NullLayout,Swing被指定为使用LayoutManager