我在 Swing 中编写了一个应用程序,它侦听来自智能电池的 UDP 数据包,并将它们显示在 JFrame 内的 JPanel 内的 JTextFields 中。
出于某种原因,最小化应用程序然后恢复它会平滑主框架中心内的所有文本,并防止对 JTextFields 的更新被绘制到屏幕上。
我不确定为什么会发生这种情况(Swing newb)或确切地如何解决它。以下是带有相关代码的代码片段。
public class Initializer {
public void initialize() {
//The mediator performs all updates of the BatteryPanel
mediator = Mediator.getInstance();
//BatteryService listens for UDP packets and uses mediator to update panel
bService = new BatteryService();
createGUI();
bService.start();
}
public void createGUI() {
bPanel = new BatteryPanel();
frame = new JFrame();
//For spacing between the BatteryPanel and the edge of the window
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(6,8,8,6);
frame.getContentPane().add(bPanel, gbc);
frame.setResizable(false);
mediator.setBatteryPanel(bPanel);
frame.pack();
frame.setVisible(true);
}
}
public class BatteryService {
private Mediator mediator;
...
//This is inside a SwingWorker - we have data now update the panel
protected void process(List<BatteryUpdateBean> bBeans) {
...
mediator.setBatteryStatus(status);
mediator.setTemperature(temperature);
mediator.setLastConnected(lastConnected);
}
}
}
}
public class BatteryPanel extends JPanel {
private static final int AFTER_LABEL_SPACE = 8;
private static final int AFTER_TITLE_SPACE = 8;
private static final int BETWEEN_ROWS_SPACE = 3;
private JTextField statusField;
private JTextField temperatureField;
private JTextField lastConnectedField;
public BatteryPanel() {
initComponents();
}
//get textfield methods snipped
...
private void initComponents() {
JLabel titleLabel = new JLabel("Battery");
titleLabel.setFont(new Font("Tahoma", Font.BOLD, 14));
JLabel lastConnectedLabel = new JLabel("Last connected:");
JLabel statusLabel = new JLabel("Status:");
JLabel temperatureLabel = new JLabel("Temperature:");
temperatureField= new JTextField("NO CONNECTION ");
temperatureField.setOpaque(false);
temperatureField.setEditable(false);
temperatureField.setBorder(BorderFactory.createEmptyBorder());
statusField= new JTextField(" ");
statusField.setOpaque(false);
statusField.setEditable(false);
statusField.setBorder(BorderFactory.createEmptyBorder());
powerField = new JTextField(" ");
powerField.setOpaque(false);
powerField.setEditable(false);
powerField.setBorder(BorderFactory.createEmptyBorder());
setLayout(new GridBagLayout());
GridBagConstraints titleC = new GridBagConstraints();
GridBagConstraints lastConnectedLabelC = new GridBagConstraints();
GridBagConstraints statusLabelC = new GridBagConstraints();
GridBagConstraints temperatureLabelC = new GridBagConstraints();
GridBagConstraints statusFieldC = new GridBagConstraints();
GridBagConstraints temperatureFieldC = new GridBagConstraints();
GridBagConstraints lastConnectedFieldC = new GridBagConstraints();
titleC.gridx = 0; titleC.gridy = 0; titleC.gridwidth = 2;
titleC.anchor = GridBagConstraints.FIRST_LINE_START;
titleC.insets = new Insets(0, 0, AFTER_TITLE_SPACE, 0);
lastConnectedLabelC.gridx = 0; lastConnectedLabelC.gridy = 1;
lastConnectedLabelC.anchor = GridBagConstraints.LINE_START;
lastConnectedLabelC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,AFTER_LABEL_SPACE);
lastConnectedFieldC.gridx = 1; lastConnectedFieldC.gridy = 1;
lastConnectedFieldC.anchor = GridBagConstraints.LINE_START;
lastConnectedFieldC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,0);
statusLabelC.gridx = 0; statusLabelC.gridy = 2;
statusLabelC.anchor = GridBagConstraints.LINE_START;
statusLabelC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,AFTER_LABEL_SPACE);
statusFieldC.gridx = 1; statusFieldC.gridy = 2;
statusFieldC.anchor = GridBagConstraints.LINE_START;
statusFieldC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,0);
statusFieldC.fill = GridBagConstraints.HORIZONTAL;
temperatureLabelC.gridx = 0; temperatureLabelC.gridy = 3;
temperatureLabelC.anchor = GridBagConstraints.LINE_START;
temperatureLabelC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,AFTER_LABEL_SPACE);
temperatureFieldC.gridx = 1; temperatureFieldC.gridy = 3;
temperatureFieldC.anchor = GridBagConstraints.LINE_START;
temperatureFieldC.insets = new Insets(0,0,BETWEEN_ROWS_SPACE,0);
...
//add (item, constraints) snipped
}
我非常感谢任何人对此的帮助。