Lorsque j'utilise JFileChooser et que j'essaye d'ajouter d'autres composants, ils n'apparaissent pas. Si je supprime JFileChooser, ils apparaissent. J'écris en java sur eclipse, et il y a deux fichiers.
J'ai supprimé la majorité de mon code pour simplifier le problème, mais il existe toujours.
Main.java:
import java.awt.Color; import java.awt.Graphics; import java.io.IOException; import javax.swing.JSlider; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JPanel; public class Frame extends JPanel { int menuNum = 0; boolean first = true; JButton nextButton = new JButton("Next"); JSlider slider = new JSlider(0,255,0); JFileChooser fileChooser = new JFileChooser(); public Frame(Color background, int w, int h) throws IOException { //initialize this.setBackground(background); setFocusable(true); } public void paintComponent(Graphics G) { super.paintComponent(G); G.setColor(Color.WHITE); G.drawString("MenuNum: " + menuNum, 1000, 500); //for debugging if(menuNum == 0) { //first menu if(first) { //only run once first = false; this.removeAll(); this.add(nextButton); System.out.println("HERE"); } if(fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { //if "Done" is selected menuNum = 1; //go to next menu first = true; } } if(menuNum == 1) { //second menu if(first) { //only run once first = false; this.removeAll(); this.add(nextButton); this.add(slider); //<This is the slider that is not showing up System.out.println("HERE2"); } } } }
Frame.java:
import java.awt.Color; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; public class Main { public static void main(String args[]) throws InterruptedException, IOException { int width = 1280; int height = 720; Frame f = new Frame(Color.BLACK, width, height); JFrame frame = new JFrame("Title"); //create a new window and set title on window frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set the window to close when the cross in the corner is pressed frame.setSize(width,height); frame.add(f); //add the content of the game object to the window frame.setVisible(true); long interval = (long)10 * 10000000; long t = 0; while(true) { if(System.nanoTime() - t >= interval) { //repaints at a certain fps t = System.nanoTime(); f.repaint(); } TimeUnit.NANOSECONDS.sleep(10); } } }
Si vous l'exécutez sur votre propre ordinateur, vous pouvez sélectionner n'importe quel fichier pour le tester, car il ne fait rien avec le fichier sélectionné.
Je suis un peu nouveau sur JPanels et JFrames, donc tout conseil sera apprécié. Merci.
3 Réponses :
Suivez simplement la même idée, vous obtiendrez
public MyControlPanel() { initComponents(); JSlider slider = new JSlider(); slider.setMajorTickSpacing(10); slider.setPaintLabels(true); slider.setPaintTicks(true); JTextField boundary_length = new JTextField("Boundary Length"); JTextField area = new JTextField("Area"); setLayout(new FlowLayout()); this.add(slider); this.add(area); this.add(boundary_length); }
Mais le problème est que même si j'appelle "this.add ()", le composant n'apparaît toujours pas.
Tout d'abord, il n'y a absolument aucune raison de faire une peinture personnalisée. Vous ne devriez jamais essayer d'ajouter / supprimer des composants d'un JPanel dans une méthode de peinture.
Les composants doivent être ajoutés au panneau dans le constructeur de votre classe. Cela signifie donc que le bouton doit être ajouté au panneau.
Ensuite, vous ajoutez un ActionListener
au bouton. Lorsque vous cliquez sur le bouton, vous effectuez un traitement.
Si vous souhaitez modifier les composants du panneau dans ActionListener
la logique de base est la suivante:
panel.remove(...); panel.add(...); panel.revalidate(); panel.repaint();
Vous avez donc besoin de revalidate()
pour appeler le gestionnaire de disposition. Sinon, la taille du composant ajouté est (0, 0), ce qui signifie qu'il n'y a rien à peindre.
Apprenez les bases de Swing en lisant le tutoriel Swing . Peut-être commencer par la section sur:
J'ai eu un problème similaire et j'ai trouvé la solution avec la méthode updateUI (). Regardez ci-dessous:
if(fileChooser.showOpenDialog(null) == 0 // this is the value for JFileChooser.APPROVE_OPTION) { //if "Done" is selected menuNum = 1; //go to next menu first = true; } else { refresh(); }
Ainsi, lorsque votre JFilechooser se ferme, vous devez appeler le refresh () ainsi:
private void refresh() { if(slider != null) { slider.updateUI(); } }
J'espère que cela devrait fonctionner.
NE JAMAIS, JAMAIS, modifier l'état du composant à partir de la méthode
paintComponent
- vous ne comprenez clairement pas comment fonctionne la peinture personnalisée (ou comment le système). Vous devez revenir aux bases, en commençant par Créer une interface graphique avec JFC / Swing et disposer les composants dans un conteneurQuelle est la fonctionnalité que vous essayez d'atteindre?