Java GUI classe buttonPanel


Je veux qu'un panneau de 12 boutons apparaisse dans mon interface graphique. Mais pour une raison quelconque, ils ne se présentent pas. Je ne sais pas ce qui ne va pas avec mon code en ce moment. Je n'ai encore rien mis dans ma méthode d'action effectuée, mais je le ferai (en ce moment, je me concentre uniquement sur l'affichage des boutons). Quelqu'un pourrait me dire ce qui ne va pas? Merci!

Edit * C'est tout ce qui est dans ma classe GUI, je veux que deux toiles d'objets d'ascenseur s'affichent (rien ne s'affiche)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class GUI extends JFrame implements ActionListener 
{
private static final Dimension PREF_SIZE = new Dimension(1000, 1000);

MyCanvas leftCanvas = new MyCanvas();
MyCanvas rightCanvas = new MyCanvas();
ArrayList<JButton> buttonList = new ArrayList<JButton>(); 
JPanel buttonPanel, leftPanel, rightPanel;

public GUI()
{
  super("Elevators");
    //setSize(800,800);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //setVisible(true);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new GridLayout(1,3));

    leftPanel = new JPanel();
    leftPanel.add(leftCanvas);
    rightPanel = new JPanel();
    rightPanel.add(rightCanvas);

    buttonPanel = new JPanel();     
    buttonPanel.setLayout(new GridLayout(12,1));   
    buttonPanel.setSize(900,900);

    add(mainPanel); 

    for(int i=0; i<12; i++)
    {
        buttonList.add(new JButton(""+i));
        JButton btn = buttonList.get(i);
        buttonPanel.add(btn);
    }
    mainPanel.add(buttonPanel, BorderLayout.CENTER);
    mainPanel.add(leftPanel, BorderLayout.EAST);
    mainPanel.add(rightPanel, BorderLayout.WEST);
    createAndShowGui();
}
@Override
public Dimension getPreferredSize() {
    return PREF_SIZE;
}
private static void createAndShowGui() {
  UI frame = new UI();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
}
//public static void main(String[] args) {
  //SwingUtilities.invokeLater(new Runnable() {
    // public void run() {
      //  createAndShowGui();
   //  }
  //});
//} 
//public void paint(Graphics g)
//{

// }

public void actionPerformed(ActionEvent e)
{

}

}    

Ici est ma classe Canvas

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JButton;

public class MyCanvas extends Canvas 
{
private Elevator e;

int xPos =0;
int yPos=0;

public MyCanvas()
{
   setSize(600,600);
   repaint();
}


public void paint(Graphics g)
{
   g.setColor(Color.BLACK);
   g.fillRect(xPos,yPos,100, 100);


}

public void actionPerformed(ActionEvent e)
{
    repaint();
}
public void setElevator(Elevator ev)
{
    e = ev;
}
} 

C'est ce que j'essaie d'accomplir avec le projet

Author: Big_Fan, 2012-10-25

3 answers

Vous avez remplacé la méthode paint du cadre...

public void paint(Graphics g)
{

}

Mais n'a pas réussi à appeler super.paint(g)....

L'Une des responsabilités de paint est de peindre les composants enfants...

MISE À JOUR

De plus, l'appel à {[5] } perturbe votre mise en page car les contraintes ont été supprimées, ce qui signifie que le gestionnaire de mise en page ne sait pas ce qui devrait aller où

Exemple MIS À jour

J'ai pu produire cela...

entrez la description de l'image ici

Avec ce

public class Elevator02 {

    public static void main(String[] args) {
        new Elevator02();
    }

    public Elevator02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                UI ui = new UI();
                ui.setLocationRelativeTo(null);

            }
        });
    }

    public class UI extends JFrame implements ActionListener {

        ArrayList<Button> buttonList = new ArrayList();
        JPanel buttonPanel;

        public UI() {
            super("Elevators");
            setSize(200, 400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);

            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new GridLayout(1, 3));

            buttonPanel = new JPanel();
            buttonPanel.setLayout(new GridLayout(12, 1));

            add(mainPanel);

            for (int i = 0; i < 12; i++) {
                buttonList.add(new Button("" + i));
                buttonPanel.add(buttonList.get(i));
                buttonList.get(i).addActionListener(this);
            }
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mainPanel.add(buttonPanel);
        }

//        public void paint(Graphics g) {
//        }
        public void actionPerformed(ActionEvent e) {
        }
    }
}
 4
Author: MadProgrammer, 2012-10-25 03:02:04

Modifier:

Avant (votre code fourni)

this.add(mainPanel); 

    for(int i=0; i<12; i++)
    {
        buttonList.add(new Button(""+i));
        buttonPanel.add(buttonList.get(i));
        buttonList.get(i).addActionListener(this);
    }
    this.setLayout(new BorderLayout());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainPanel.add(buttonPanel, BorderLayout.CENTER);

Après: (définir la disposition du cadre avant d'y ajouter des composants)

    this.setLayout(new BorderLayout()); // move this line
    this.add(mainPanel); 

    for(int i=0; i<12; i++)
    {
        buttonList.add(new Button(""+i));
        buttonPanel.add(buttonList.get(i));
        buttonList.get(i).addActionListener(this);
    }

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainPanel.add(buttonPanel, BorderLayout.CENTER);
 3
Author: Jiman, 2012-10-25 02:19:27

Recommandations:

  • Ne définissez pas la disposition du JFrame sur BorderLayout -- son contentPane utilise déjà BorderLayout.
  • N'utilisez pas de contrainte BorderLayout lors de l'ajout d'un composant à un conteneur GridLayout-using.
  • Utilisez JButtons, pas de Boutons (composants Swing, pas de composants AWT)
  • Ne définissez pas la taille de quoi que ce soit. Au lieu de cela, remplacez getPreferredSize() en renvoyant la dimension souhaitée.
  • Encore mieux, laissez les composants se dimensionner à leur meilleur taille.
  • Vous voulez toujours appeler pack() après avoir ajouté tous les composants à la fenêtre de niveau supérieur (ici le JFrame) et avant d'appeler setVisible(true).

Par exemple

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public class UI extends JFrame {
   private static final Dimension PREF_SIZE = new Dimension(800, 800);
   private ArrayList<JButton> buttonList = new ArrayList<JButton>();
   private JPanel buttonPanel;

   public UI() {
      super("Elevators");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      JPanel mainPanel = new JPanel();
      mainPanel.setLayout(new BorderLayout());

      buttonPanel = new JPanel();
      buttonPanel.setLayout(new GridLayout(12, 1));

      add(mainPanel);

      for (int i = 0; i < 12; i++) {
         buttonList.add(new JButton("" + i));
         JButton btn = buttonList.get(i);
         buttonPanel.add(btn);
      }
      mainPanel.add(buttonPanel, BorderLayout.CENTER);
   }

   @Override
   public Dimension getPreferredSize() {
      return PREF_SIZE;
   }

   private static void createAndShowGui() {
      UI frame = new UI();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

, Qui s'affiche comme,

Image de Panneau de Bouton

Modifier 2
Envisagez d'utiliser BorderLayout pour l'interface graphique globale, les deux images d'ascenseur pourraient être placées dans BorderLayout.LINE_START et BorderLayout.LINE_END positions. Les JPanels d'ascenseur qui pourraient utiliser la disposition nulle pour permettre à l'elivator composant pour changer de position. Le JPanel central pourrait également utiliser BoxLayout orienté dans un BoxLayout.PAGE_AXIS (à la verticale).

 2
Author: Hovercraft Full Of Eels, 2012-10-25 02:57:12