3

これが私のコードです: 私は必要ないと感じたものをいくつか取り出しました。括弧もいくつか取り除いたかもしれませんが、私が持っているコンテンツを表示しようとしているだけです。

プログラムを実行すると、背景画像が描画され(リソースのPNGです)、最初のボタンである1つのボタン(再生ボタン)のみが表示されます-自動選択されます。

実際には 4 つのボタンがありますが、コードには PLAY と INSTRUCTIONS のみを含めました。他の 3 つは、マウスオーバーしない限り表示されません。おそらくペイント方法がおかしいことはわかっていますが、修正方法がわかりません。

別のボタンを選択してウィンドウを最小化してから再度開くと、選択したボタンだけが表示されます。他のボタンを表示するには、マウスオーバーする必要があります。

super.paint()も paint メソッドに追加しました。すべてのボタンを取得しましたが、背景は灰色です。問題はsuper.paint()、すべてのボタンをペイントしg.drawImage(bg, 0, 0, null)、背景のみをペイントすることであり、他のボタンをペイントせずに一方を実行できないことだと思います。

これが混乱した場合は申し訳ありません。私は Java の初心者で、自分が言おうとしていることを明確にするのに苦労しています。

public class MainMenu extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */

    //variables
    public static Image bg;

    public static void main(String[] args) {

        MainMenu mainFrame = new MainMenu();
        mainFrame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        mainFrame.setResizable(false);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setTitle ("Zumby");
        mainFrame.setLayout(null);

        // Loads the background image and stores in bg object.
        try {
            bg = ImageIO.read(new File("zumby.png"));
        } catch (IOException e) {
        }
        mainFrame.setVisible(true);
    }

    /**
     * Overrides the paint method.
     * MONDAY
     */
     public void paint(Graphics g)
     {
        // Draws the img to the BackgroundPanel.
        System.out.println("paint");
        g.drawImage(bg, 0, 0, null);
     }

    /**
     */
    public MainMenu() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 500);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setOpaque(false);
        setContentPane(contentPane);
        contentPane.setLayout(null);

        //create buttons
        JButton btnPlay = new JButton("PLAY");
        btnPlay.setBackground(Color.BLACK);
        btnPlay.setForeground(Color.WHITE);
        btnPlay.setFont(font);
        btnPlay.setBorder(border);
        btnPlay.setFocusPainted(false);

        //if "Play" is clicked

        btnPlay.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent click) {
                setVisible(false);
                new GamePlay(); //opens up GamePlay window
            }
        });
        btnPlay.setBounds(600, 64, 141, 61);
        contentPane.add(btnPlay);

        JButton btnInstructions = new JButton("INSTRUCTIONS");

        btnInstructions.setBounds(600, 160, 141, 61);
        btnInstructions.setBackground(Color.BLACK);
        btnInstructions.setFocusPainted(false);
       // btnInstructions.setEnabled(true);

        contentPane.add(btnInstructions);
        repaint();
        pack(); 
        setVisible(true);

    }

}
4

4 に答える 4

3

Swing は、ペイントに「レイヤリング」の概念を使用しています...

paintpaintComponentpaintBorderおよび を呼び出しますpaintChildren。をオーバーライドpaintして呼び出しsuper.paintに失敗することで、コンポーネントがさまざまなレイヤーを描画するのを防ぎました。

Swing では、paintComponentカスタム ペインティングを提供するために使用することをお勧めします。これにより、コンポーネントに追加される可能性のある他のコンポーネントの下にペイントできます。

ここに画像の説明を入力

public class TestPaint01 {

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

  public TestPaint01() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestPane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

      }
    });
  }

  public class TestPane extends JPanel {

    private Image backgroundImage;

    public TestPane() {
      try {
        BufferedImage background = ImageIO.read(new File("/path/to/image.jpg"));
        //backgroundImage = background.getScaledInstance(-1, background.getHeight() / 4, Image.SCALE_SMOOTH);
        backgroundImage = background;
      } catch (IOException ex) {
        ex.printStackTrace();
      }
      setLayout(new GridBagLayout());
      add(new JButton("Hello"));
    }

    @Override
    public Dimension getPreferredSize() {
      return backgroundImage == null ? super.getPreferredSize() : new Dimension(backgroundImage.getWidth(this), backgroundImage.getHeight(this));
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      int x = (getWidth() - backgroundImage.getWidth(this)) / 2;
      int y = (getHeight() - backgroundImage.getHeight(this)) / 2;
      g.drawImage(backgroundImage, x, y, this);
    }

  }

}

Paint MechanismAWT と Swingのペイントを詳しく見てみると、参考になるかもしれません。

于 2013-01-21T01:29:55.663 に答える
2

オーバーライドしていますpaint()が、呼び出さないでくださいsuper.paint()。そのため、JFrameのpaint()メソッド実装によって行われるコンポーネントの通常のペイントは実行されません。

于 2013-01-20T17:26:01.220 に答える
2

Swing を使用しているため、通常はアプレットまたは AWT で使用されるものではなく、JFrameオーバーライドするために使用される描画メカニズムです。paintComponentpaint

于 2013-01-20T18:03:05.887 に答える
2

paint メソッドをオーバーライドしているためだと思います。再描画をオーバーライドしてから、super.repaint(); を呼び出すことをお勧めします。このような:

public void repaint(Graphics g)
        {
             super.repaint(g);
         // Draws the img to the BackgroundPanel.
             System.out.println("paint");
           g.drawImage(bg, 0, 0, null);
        }

次に、コンポーネントも再描画されます。

ただし、背景として画像を表示するだけの場合は、こちらを参照してください。

于 2013-01-20T17:08:11.013 に答える