最小化和恢复Swing窗口中断布局和重绘

时间:2010-05-05 13:20:19

标签: java swing gridbaglayout

我在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       
}

我非常感谢任何人对此的帮助。

1 个答案:

答案 0 :(得分:3)

在最高级别的GridBagConstraints上,您是否考虑过设置对象的其他属性?我会调查一下:

gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;

此外,在您的BatteryPanel中,您可以重复使用相同的GridBagConstraints对象,只需更改值即可。有关详细信息,请查看GridBagLayout tutorial

修复布局后,我认为您会发现行为符合预期。