1

GUI に 12 個のボタンのパネルを表示したい。しかし、何らかの理由でそれらは表示されません。現在、コードの何が問題なのかわかりません。アクション実行メソッドにはまだ何も入れていませんが、入れます (今は、ボタンを表示することに集中しています)。それで、誰かが何が悪いのか教えてもらえますか?ありがとう!

編集*これが私のGUIクラスのすべてです。エレベーターオブジェクトの2つのキャンバスを表示したい(何も表示されていません)

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)
{

}

}    

これが私のキャンバスクラスです

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;
}
} 

これは私がプロジェクトで達成しようとしていることです

4

3 に答える 3

4

フレームのpaintメソッドをオーバーライドしました...

public void paint(Graphics g)
{

}

しかし、電話に失敗しましたsuper.paint(g)....

の責任の 1 つはpaint、子コンポーネントをペイントすることです...

更新しました

また、制約が破棄されているため、への呼び出しがthis.setLayout(new BorderLayout())レイアウトを台無しにしています。つまり、レイアウト マネージャーは、何がどこにあるのかわかりません。

更新された例

これを製作できたのは…

ここに画像の説明を入力

これとともに

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) {
        }
    }
}
于 2012-10-25T02:09:24.080 に答える
3

編集:

前(提供されたコード)

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);

後: (フレームにコンポーネントを追加する前にフレームのレイアウトを設定)

    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);
于 2012-10-25T02:08:17.497 に答える
2

推奨事項:

  • JFrame のレイアウトを BorderLayout に設定しないでください。その contentPaneはすでにBorderLayout を使用しています。
  • GridLayout を使用するコンテナーにコンポーネントを追加するときは、BorderLayout 制約を使用しないでください。
  • ボタンではなく JButton を使用する (AWT コンポーネントではなく Swing コンポーネント)
  • 何もサイズを設定しないでください。代わりgetPreferredSize()に、目的のディメンションを返すことをオーバーライドします。
  • さらに良いことに、コンポーネントのサイズを最適なサイズに合わせます。
  • pack()すべてのコンポーネントを最上位ウィンドウ (ここでは JFrame) に追加した後、を呼び出す前に常に呼び出す必要がありsetVisible(true)ます。

例えば、

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();
         }
      });
   }
}

次のように表示されます。

ボタン パネル イメージ

編集 2
GUI 全体に BorderLayout を使用することを検討してください。2 つのエレベーター画像を BorderLayout.LINE_START と BorderLayout.LINE_END の位置に配置できます。null レイアウトを使用してエレベーター コンポーネントの位置を変更できるエレベーター JPanel。中央の JPanel は、BoxLayout.PAGE_AXIS (垂直) で方向付けられた BoxLayout を使用することもできます。

于 2012-10-25T02:07:07.677 に答える