Domanda

ho scritto un'applicazione in Swing che ascolti per pacchetti UDP da una batteria intelligente e li visualizza in JTextFields all'interno di un JPanel all'interno di un JFrame.

Per qualche ragione, minimizzando l'applicazione e quindi ripristinandola smooshes tutto il testo all'interno del centro del telaio principale e impedisce aggiornamenti alle JTextFields da trarre allo schermo.

Non sono sicuro perché questo sta accadendo (newb Swing) o esattamente come risolvere il problema. Qui di seguito sono frammenti di codice con il relativo codice.

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       
}

apprezzerei notevolmente l'aiuto di nessuno, con questo.

È stato utile?

Soluzione

Sulla vostra GridBagConstraints al livello più alto, avete considerato l'impostazione delle altre proprietà dell'oggetto? Mi piacerebbe guardare in:

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

Inoltre, nel vostro BatteryPanel, è possibile riutilizzare lo stesso oggetto GridBagConstraints e basta cambiare i valori. Controlla la GridBagLayout esercitazione per ulteriori informazioni.

Una volta a risolvere il layout, credo che troverete il comportamento deve essere come previsto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top