2015-10-16 56 views
0

我试过太多了,并且正在阅读很多东西。仍然无法找到我的案件的任何工作解决方案。所以这里是交易。游戏中,玩家的钱正在变化。我试图实现的是从JTable即时显示钱币,所以玩家只需看着桌子就可以随时追踪他的钱。但是,正如你可以假设的那样,当它改变时我没有改变钱。它只停留在它开始的数量上。JTable中的数据不会改变

到目前为止,我得到的是一个精心打造的JTable,它显示了玩家在开始时的初始资金以及我的JTable的自定义模型。

因为我相信解决方案依赖于模型和setValuesAt(Object value, int row, int column),我试图找出一个出路。我到那里有一种叫做刷新的方法。更具体地说,让我告诉你一些我的代码。

因此,这里是在构造函数中我rowData阵列,我使用在游戏开始时显示的初始资金,其中:

rowData = new Object[][]{ 
       {GameFlow.getPlayer1().getName(), "Pink", GameFlow.getPlayer1().getMoney()}, 
       {GameFlow.getPlayer2().getName(), "Blue", GameFlow.getPlayer2().getMoney()}, 
       {GameFlow.getPlayer3().getName(), "Green", GameFlow.getPlayer3().getMoney()}, 
       {GameFlow.getPlayer4().getName(), "Red", GameFlow.getPlayer4().getMoney()}, 
     }; 

因你们说,我还需要向你展示这两个以下功能,setValueAt和刷新(刷新的方法我只写了简单的更新变化):

public void setValueAt(Object value, int row, int col) { 
    rowData[row][col] = value; 
    fireTableCellUpdated(row, col); 
} 
public void refresh(){ 
    for (int i = 0; i < 4; i++) { 
     setValueAt(GameFlow.getPlayer1().getMoney(), i, 2); 
    } 
} 

这里,在刷新,我只是试图改变第二(第2)行,因为前两是静态的,永远不会改变。另外,for循环中的数字4是玩家的数量,所以4保存行数。

您可以在整个下面我表型号代码中找到:

import javax.swing.table.AbstractTableModel; 

public class MonopolyTableModel extends AbstractTableModel { 
    private String[] columnNames = { 
      "Name", 
      "Color", 
      "Money", 
    }; 
    private Object[][] rowData; 

    public MonopolyTableModel() { 
     rowData = new Object[][]{ 
       {GameFlow.getPlayer1().getName(), "Pink", GameFlow.getPlayer1().getMoney()}, 
       {GameFlow.getPlayer2().getName(), "Blue", GameFlow.getPlayer2().getMoney()}, 
       {GameFlow.getPlayer3().getName(), "Green", GameFlow.getPlayer3().getMoney()}, 
       {GameFlow.getPlayer4().getName(), "Red", GameFlow.getPlayer4().getMoney()}, 
     }; 
    } 
    @Override 
    public int getRowCount() { 
     return rowData.length; 
    } 
    @Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 
    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return rowData[rowIndex][columnIndex]; 
    } 

    public void setValueAt(Object value, int row, int col) { 
     rowData[row][col] = value; 
     fireTableCellUpdated(row, col); 
    } 

    public String getColumnName(int columnIndex) { 
     return columnNames[columnIndex]; 
    } 

    public void refresh(){ 
     for (int i = 0; i < 4; i++) { 
      setValueAt(GameFlow.getPlayer1().getMoney(), i, 2); 
     } 
    } 

} 

这就是我在桂类如何使用:

MonopolyTableModel monoModel = (MonopolyTableModel) dataTable.getModel(); 
monoModel.refresh(); 

希望这些都足以证明,如果需要的话我可以展示更多,但因为这是一个我不想表现出色的学校项目。

+0

考虑提供一个[可运行示例](https://stackoverflow.com/help/mcve),它演示了您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这会减少混淆和更好的反应 – MadProgrammer

+0

您的'setValueAt'方法与实际的'player'对象没有任何关系,所以您在表中更改的任何值都不会影响'player'对象 – MadProgrammer

+0

玩家的钱在游戏,我相信它。所以,setValueAt与更改播放器无关。我只是无法在桌面上刷新。当然,我会尽力为您提供更多的代码 –

回答

2

要根据您提供的不在上下文中的代码找出问题可能有点难。

当我处理JTable时,我用它来建模物理数据,在您的情况下,这就是Player对象。这样,如果Player在表格外进行修改,则只需触发对模型的更新即可使表格刷新值。同样,您也可以将一些功能集中到表格中,并使用它直接修改对象Player

这样,模型和数据始终同步(即使显示不)

在这个例子中,有两种方法来更新模型/表。

首先,你可以更新Player对象,并要求模型“刷新”给出的球员,例如...

Player player = model.getPlayerAt(selectedRow); 
player.setMoney(player.getMoney() + 10); 
model.update(player); 

或者你可以有模型通过setValueAt方法更新Player。 ..

Player player = model.getPlayerAt(selectedRow); 
model.setValueAt(player.getMoney() - 10, selectedRow, 1); 

作为一个可运行的例子...

Updatable Table

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private PlayerTableModel model; 

     public TestPane() { 
      List<Player> players = new ArrayList<>(5); 
      players.add(new Player("Han Solo", 100d)); 
      players.add(new Player("Dark Vadar", 100d)); 
      players.add(new Player("R2-D2", 100d)); 
      players.add(new Player("Darth Maul", 100d)); 
      players.add(new Player("Jawa", 100d)); 

      setLayout(new BorderLayout()); 
      model = new PlayerTableModel(players); 
      JTable table = new JTable(model); 
      add(new JScrollPane(table)); 

      JPanel actions = new JPanel(); 
      JButton add = new JButton("+"); 
      JButton subtract = new JButton("-"); 

      actions.add(add); 
      actions.add(subtract); 

      add.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int selectedRow = table.getSelectedRow(); 
        if (selectedRow >= 0) { 
         selectedRow = table.convertRowIndexToModel(selectedRow); 
         Player player = model.getPlayerAt(selectedRow); 
         player.setMoney(player.getMoney() + 10); 
         model.update(player); 
        } 
       } 
      }); 
      subtract.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int selectedRow = table.getSelectedRow(); 
        if (selectedRow >= 0) { 
         selectedRow = table.convertRowIndexToModel(selectedRow); 
         Player player = model.getPlayerAt(selectedRow); 
         model.setValueAt(player.getMoney() - 10, selectedRow, 1); 
//      player.setMoney(player.getMoney() - 10); 
//      model.update(player); 
        } 
       } 
      }); 

      add(actions, BorderLayout.SOUTH); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     } 

    } 

    public static class PlayerTableModel extends AbstractTableModel { 

     protected static final String COLUMNN_NAMES[] = {"Name", "Money"}; 

     private List<Player> players; 

     public PlayerTableModel(List<Player> players) { 
      this.players = new ArrayList(players); 
     } 

     public Player getPlayerAt(int row) { 
      return players.get(row); 
     } 

     @Override 
     public int getRowCount() { 
      return players.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return COLUMNN_NAMES.length; 
     } 

     @Override 
     public String getColumnName(int column) { 
      return COLUMNN_NAMES[column]; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      Player player = players.get(rowIndex); 
      Object value = null; 
      switch (columnIndex) { 
       case 0: 
        value = player.getName(); 
        break; 
       case 1: 
        value = player.getMoney(); 
        break; 
      } 
      return value; 
     } 

     @Override 
     public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
      if (columnIndex == 1) { 
       Player player = players.get(rowIndex); 
       player.setMoney((double)aValue); 
       super.setValueAt(aValue, rowIndex, columnIndex); 
       fireTableCellUpdated(rowIndex, columnIndex); 
      } 
     } 

     public void update(Player player) { 
      int row = players.indexOf(player); 
      fireTableRowsUpdated(row, row); 
     } 

    } 

    public class Player { 

     private String name; 
     private double money; 

     public Player(String name, double money) { 
      this.name = name; 
      this.money = money; 
     } 

     public double getMoney() { 
      return money; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setMoney(double money) { 
      this.money = money; 
     } 

    } 

} 

的一点是,不应该有你的球员和模型之间的这种断开,即使你需要将播放器包装到另一个对象中,这样您就可以扩展要显示的属性,至少在这种情况下,当您询问某个值时,它与该对象实际具有的值相同,并且在设置该值时,它已设置为同一个对象。

+0

虽然我尝试过,但我认为我不清楚如何告诉我的问题,你告诉我的不是我想要的。但是,根据你对玩家与表格的关联的建议,我重新阅读了我的整个代码,这一次我发现了这个错误。从字面上看,我不知道如何,每个玩家有两个例子,而其中一个玩家正在改变钱币,另一个玩家没有改变桌子上的价值。除了表格,这是一个不同的问题。无论如何。非常感谢。为你的努力付出努力,但不接受答案抱歉。 –

+0

@KutayDemireren如果你使用了上面的建议,你可能不会有这个问题。所以这个“bug”是在你没有提供的代码中,很高兴看到当时没有人能够回答你的问题。很高兴你找到答案。您可以删除该问题,因为根据您的示例代码将无法回答;) – MadProgrammer