繁体   English   中英

重绘时,JTable无法重绘

[英]JTable Not Redrawing When Repaint Called

嗨,我的计时器事件发生时,我的数据表无法重绘时遇到了困难。 我正在检查我正在制作的游戏中的玩家连通性。 当播放器连接时,JTable应该更改为显示播放器已连接; 但是,即使填充表的变量发生了变化,该表也没有发生变化。

我的GUI代码链接在下面,基本上是在连接了播放器时,GUI代码中的字符串变量发生了变化,然后我的计时器应该每秒重新绘制一次表格,并注意更改并重新绘制了正确的信息。 该变量正在更改,我可以在控制台中看到该输出,但是该表不会相应地更新。

谢谢您的光临。

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class DPServerGUI extends JFrame implements ActionListener
{
  private DPServerTest mainServer;

  private JPanel serverPanel;
  private JButton startButton;
  private JButton loadServerButton;
  private JLabel serverLabel;
  String[] header = {"Players", "Connected To Server"};
  private JTable connectedClientsList;
  private DefaultTableModel tableModel;
  private JScrollPane scrollPane;
  private static Dimension dim;
  private Timer timer;
  public static String player1Connected = "No";
  public static String player2Connected = "No";
  public static String player3Connected = "No";
  public static String player4Connected = "No";

  public DPServerGUI()
  {
    serverPanel = new JPanel();

    startButton = new JButton("Start Game");
    startButton.addActionListener(this);

    loadServerButton = new JButton("Load Server");
    loadServerButton.addActionListener(this);

    tableModel =  new DefaultTableModel();
    scrollPane = new JScrollPane(getTable());

    serverLabel = new JLabel("Server Not Running");
    dim = Toolkit.getDefaultToolkit().getScreenSize();

    serverPanel.add(serverLabel);
    serverPanel.add(startButton);
    serverPanel.add(loadServerButton);
    serverPanel.add(scrollPane);
    this.add(serverPanel);
  }

  private JTable getTable()
  {
    String[][] table = 
    {
        {"Player 1", player1Connected},
        {"Player 2", player2Connected},
        {"Player 3", player3Connected},
        {"Player 4", player4Connected}
    };
    connectedClientsList = new JTable(table, header);
    return connectedClientsList;
  }
  public void updatePlayerList()
  {
    String [][] playerList = mainServer.exportPlayerList();
    connectedClientsList = new JTable(playerList, header);
  }
  @Override
  public void actionPerformed(ActionEvent event)
  {
    if (event.getSource() == loadServerButton)
    {
      System.out.println("Load server clicked!");
      loadServerButton.setEnabled(false);
      mainServer = new DPServerTest(8888);
      serverLabel.setText("Server Loaded!");
      timer = new Timer(1000, this);
      timer.start();
    }
    if (event.getSource() == startButton)
    {
      serverLabel.setText("Game Started");
    }
    if (event.getSource() == timer)
    {
      mainServer.playerConnectionStatus();
      String[][] table = 
        {
            {"Player 1", player1Connected},
            {"Player 2", player2Connected},
            {"Player 3", player3Connected},
            {"Player 4", player4Connected}
        };
      connectedClientsList = new JTable(table, header);
      if (player1Connected != "No") System.out.println(player1Connected);
      repaint();
    }
  }

  public static void main(String[] args)
  {
    DPServerGUI serverGUI = new DPServerGUI();
    serverGUI.setTitle("Dark Project Server GUI");
    serverGUI.setSize(800,600);
    serverGUI.setLocationRelativeTo(null);
    serverGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    serverGUI.setVisible(true);
  }
}

问题是您要重新创建一个新的JTable而不是重新使用现有的JTable (此外,您不会删除旧的JTable来用新的JTable替换它,因此新的JTable将永远没有机会显示) 。

而是更新JTableTableModel 使用提供的默认表(可以通过调用JTable.getModel()来获取它)(它是DefaultTableModel ),或者通过扩展AbstractTableModel (并调用fireXXX()方法)来实现自己的fireXXX() ,您可以使用JTable.setModel()进行设置。

查看有关如何使用表的Swing教程,尤其是TableModel上的部分

附加提示:远离static变量,它们总是很痛苦。

稍作更新的代码(不是很漂亮,但是向您展示了这个想法):

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.table.AbstractTableModel;

@SuppressWarnings("serial")
public class DPServerGUI extends JFrame {

    private JPanel serverPanel;
    private JButton startButton;
    private JButton loadServerButton;
    private JLabel serverLabel;

    private JTable connectedClientsList;
    private JScrollPane scrollPane;
    public String player1Connected = "No";
    public String player2Connected = "No";
    public String player3Connected = "No";
    public String player4Connected = "No";

    public DPServerGUI() {
        serverPanel = new JPanel();

        startButton = new JButton("Start Game");

        loadServerButton = new JButton("Load Server");

        scrollPane = new JScrollPane(getTable());

        serverLabel = new JLabel("Server Not Running");

        serverPanel.add(serverLabel);
        serverPanel.add(startButton);
        serverPanel.add(loadServerButton);
        serverPanel.add(scrollPane);
        this.add(serverPanel);
    }

    private PlayerTableModel tableModel;

    public class PlayerTableModel extends AbstractTableModel {

        private String[] header = { "Players", "Connected To Server" };
        private String[][] table = { { "Player 1", player1Connected }, { "Player 2", player2Connected }, { "Player 3", player3Connected },
                { "Player 4", player4Connected } };

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

        @Override
        public int getRowCount() {
            return table.length;
        }

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

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return table[rowIndex][columnIndex];
        }

        public void setPlayerConnected(int rowIndex, boolean connected) {
            table[rowIndex][1] = connected ? "Yes" : "No";
            fireTableCellUpdated(rowIndex, 1);
        }

    }

    private JTable getTable() {
        tableModel = new PlayerTableModel();
        connectedClientsList = new JTable(tableModel);
        return connectedClientsList;
    }

    public static void main(String[] args) {
        final DPServerGUI serverGUI = new DPServerGUI();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                serverGUI.setTitle("Dark Project Server GUI");
                serverGUI.setSize(800, 600);
                serverGUI.setLocationRelativeTo(null);
                serverGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                serverGUI.setVisible(true);
            }
        });

        // Dummy thread that simulates user connecting and disconnecting randomly.
        Timer t = new Timer(2000, new ActionListener() {

            Random random = new Random();

            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < serverGUI.tableModel.getRowCount(); i++) {
                    serverGUI.tableModel.setPlayerConnected(i, random.nextBoolean());
                }

            }
        });
        t.start();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM