0

私はJavaが初めてです....フレームに2つのものを追加できることを学びました...ボタンを追加し、それに応じてボタンをクリックすると、出力として長方形が必要になります....しかし、私はそれを理解していません..なぜ私は出力を得ていないのですか.....

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

public class customizedgui5 implements ActionListener {

    JButton button;

    JFrame frame;

    public static void main(String[] args) {

        customizedgui5 hi = new customizedgui5();

        hi.go();
    }

    public void go() {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("click me");

        button.addActionListener(this);

        myclass a = new myclass();

        frame.getContentPane().add(button, BorderLayout.CENTER);

        frame.getContentPane().add(a, BorderLayout.SOUTH);

        frame.setSize(100, 100);

        frame.setVisible(true);

    }

    public void actionPerformed(ActionEvent event) {

        frame.repaint();

        frame.revalidate();

    }

}

class myclass extends JPanel {

    public void paintComponent(Graphics g) {

        g.setColor(Color.orange);

        g.fillRect(20, 50, 100, 100);

    }

}
4

2 に答える 2

2

まず、 Performing Custom Paintingを見てみましょう。

コードの主な問題はNullPointerException、 の参照が であるため、ボタンをクリックしたときに得られることframeですnull

これはnull、コンストラクターでそれをシャドーイングしたためです (基本的に、コンストラクター内で同じ名前の別の変数を宣言しました)...

// I'm null..
JFrame frame;

public void go() {
    // Not the same as frame above...
    JFrame frame = new JFrame();

また、さまざまな理由により、変更は見られません...

  1. パネルにはmyclassサイズがありません。ではBorderLayout、これは「あまり」大きな問題にはなりませんが...
  2. パネルの表示範囲外に描画しています。ペイントしている長方形は、パネルの幅と高さの外側にペイントされているため表示されません。
  3. ボタンを押す前に四角形が表示paintComponentされ、画面に表示されるとパネルの状態を更新するために呼び出されます...

最初に必要なことは、何らかのサイズのヒントを に提供することですBorderLayout。追加してみてください...

@Override
public Dimension getPreferredSize() {
    return new Dimension(120, 150);
}

myclass

また、フレームを再描画する必要はありません。本当に再描画したいのは のインスタンスですmyclass。インスタンス変数customizedgui5になるように更新してみてください( ...のようにaframe

//...
myclass a;
//...

public void go() {

    //...
    a = new myclass();
    //...

}

public void actionPerformed(ActionEvent event) {
    a.repaint();
}

これで、パネルが画面に表示された瞬間に長方形が表示されます。確かに非表示に設定することもできますが、これはフレームのレイアウトに影響を与え、最初からコンポーネントを非表示にします。代わりに、トリップできる何らかのフラグが必要です。これにより、四角形をいつペイントするかがわかります。これは、単純な変数を使用して簡単に実現できbooleanます。たとえば...

class myclass extends JPanel {

    private boolean paintRect;

    public void setPaintRect(boolean paint) {
        paintRect = paint;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(120, 150);
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        if (paintRect) {
            g.setColor(Color.orange);
            g.fillRect(20, 50, 100, 100);
        }

    }
}

次に、actionPerformedメソッドで、フラグを設定するだけです...

public void actionPerformed(ActionEvent event) {
    a.setPaintRect(true);
}

Code Conventions for the Java Programming Languageもお読みください。人々があなたのコードを読みやすくなります...

于 2013-11-13T03:13:44.020 に答える
0

ボタンをクリックすると、メソッドが呼び出されますactionPerformed(ActionEvent event)

あなたがそこで何をしたかを見てください。現在、フレームを再描画して再検証しています。フレームに四角形を追加する場合は、四角形を描画する新しいコンポーネントをフレームに追加する必要があります。

myclass JPanel次のように長方形を描画する別のインスタンスを追加できます。

public void actionPerformed(ActionEvent event) {

    frame.getContentPane().add(new myclass(), BorderLayout.NORTH);

    frame.repaint();

}

これにより、カスタムの長方形描画パネルが の北セクションに追加されますBorderLayout。ボタンの「上」に長方形を追加する場合は、ボタンを 内に埋め込み、JPanelメインの代わりに長方形描画パネルを追加する必要がありますJFrame

于 2013-11-13T03:10:14.427 に答える