Ciao a tutti.
Ho un problema, probabilmente banale, ma che mi ha già fatto perdere parecchie ore nel tentativo di capire cosa succede.
Il codice sotto riportato compila senza problemi e apre una finestra con tre pannelli: uno rosso usato come contentPane del JFrame, uno giallo nella parte alta ed uno magenta nella parte bassa del pannello rosso.
Però quando si preme Enter dopo aver assegnato un numero nella casella di testo del pannello giallo compare un altro pulsante nella zona rossa; manovrando con Tab compare poi anche una casella di testo, prima piccola, poi, assegnando dei valori, più grande e poi, dopo il nuovo Enter, ne compaiono altre.
Chi mi sa dire a cosa é dovuto lo "strano" comportamento?
Grazie.
codice:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ProvaTrePannelli { PannelloBase panBase; PannelloSuperiore panSup; PannelloInferiore panInf; public ProvaTrePannelli() { // Crea e attiva la finestra. JFrame f = new JFrame("ProvaTrePannelli"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Crea un pannello rosso da usarsi come pannello dei contenuti. panBase = new PannelloBase(); // Definisce panBase come pannello dei contenuti. f.setContentPane(panBase); // Crea un pannello giallo da mettere nella parte alta della finestra. panSup = new PannelloSuperiore(); // Ne crea un'altro magenta da mettere nella parte bassa panInf = new PannelloInferiore(); // Aggiunge i pannelli al pannello dei contenuti. panBase.add(panSup, BorderLayout.NORTH); panBase.add(panInf, BorderLayout.SOUTH); // e aggiunge una atichetta panBase.add(new JLabel("Testo in etichetta centrata.", SwingConstants.CENTER), BorderLayout.CENTER); // Visualizza la finestra. f.pack(); f.setVisible(true); } class PannelloBase extends JPanel{ /* Dovendo essere usato come pannello dei contenuti è preferibile assegnargli BorderLayout come layout manager (quello predefinito sarebbe FlowLayout) */ public PannelloBase() { setLayout(new BorderLayout()); setBackground(Color.RED); setPreferredSize(new Dimension(600, 360)); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("Testo in posizione fissa.", 50, 150); } } class PannelloSuperiore extends JPanel{ private JTextField txtY; private JButton puls; private String testo; private int y; public PannelloSuperiore() { LayoutManager layout = new FlowLayout(FlowLayout.LEFT); setLayout(layout); setBackground(Color.YELLOW); JLabel etichetta = new JLabel("Scegliere la posizione y = "); add(etichetta); txtY = new JTextField(); txtY.setPreferredSize(new Dimension(60,30)); txtY.setHorizontalAlignment(JTextField.CENTER); AscoltatoreTesto ascTxtY = new AscoltatoreTesto(); txtY.addActionListener(ascTxtY); add(txtY); puls = new JButton("Premi"); add(puls); } class AscoltatoreTesto implements ActionListener { public void actionPerformed (ActionEvent ev) { try { int ord = Integer.parseInt(txtY.getText()); setY(ord); puls.requestFocus(); } catch (NumberFormatException e) { setY(100); txtY.setText("100"); txtY.requestFocus(); } } } // fine classe AscoltatoreTesto public void setY(int y) { this.y = y; } public int getY() { return y; } } // fine classe PannelloSuperiore class PannelloInferiore extends JPanel{ public PannelloInferiore() { LayoutManager layout = new FlowLayout(FlowLayout.RIGHT); setLayout(layout); setBackground(Color.MAGENTA); JButton puls = new JButton("Neutro"); add(puls); } } // fine classe PannelloInferiore public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new ProvaTrePannelli(); } }); } } // Fine classe ProvaTrePannelli