0

以下のコードでは、左ボタンをクリックしたときに 3 つのボタンを左に移動しようとしています。クリックすると・・・ 現在何も起こりません。ここで私が間違っていることを誰かに説明してもらえますか? また、何らかの理由で正しくコンパイルされなくなりました。その理由はわかりませんが、ボタンをクリックしたときにボタンを左に移動しようとしたときにコードに誤りがあったためだと思います。ウィンドウを動かしたくありません。ウィンドウ内のボタンのみ。誰かが私が間違っていることを理解していますか?それを説明できますか?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Buttons extends JFrame {
//Control Definitions

    JButton resetButton;
    JButton leftButton;
    JButton colorButton;
    JPanel buttonPanel;
// Layout Definiton
    eventHandle evt;
    FlowLayout flt;
    Point point; //to Hold Previous Window Position
    Color color; //to Hold Previous Color

    public Buttons() {
        super("Buttons Window");
        flt = new FlowLayout();//inialize the Flow Layout
        buttonPanel = new JPanel(flt);
        //inialize the buttonPanel With Flow Layout
        //initialize buttons
        resetButton = new JButton("Reset");
        leftButton = new JButton("Left");
        colorButton = new JButton("Blue");
        evt = new eventHandle(); //initiate the eventhandle class
        buttonPanel.add(leftButton); //add leftButton
        buttonPanel.add(colorButton);//add colorButton
        buttonPanel.add(resetButton);//add colorButton
        getContentPane().add(buttonPanel);//buttonPanel
        //add actionlistners
        leftButton.addActionListener(evt);
        colorButton.addActionListener(evt);
        resetButton.addActionListener(evt);
        setBounds(20, 120, 250, 70);
        //following Initate the point with Center of Scren
        point = new Point((Toolkit.getDefaultToolkit().
                getScreenSize().width - getWidth()) / 2, 
                (Toolkit.getDefaultToolkit().getScreenSize().height
                - getHeight()) / 2);
        setLocation(point); //locates the window in center
        color = buttonPanel.getBackground();//stores the initial color
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    class eventHandle implements ActionListener { //Event Handler

        public void actionPerformed(ActionEvent e) {
            {
                if (e.getSource() == leftButton) ///if its from leftButton
                {
                    leftButton.setAlignmentX(Component.LEFT_ALIGNMENT);
                    colorButton.setAlignmentX(Component.LEFT_ALIGNMENT);
                    resetButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    //setLocation( (point.x -150), point.y);//shift the window 150 pixels left
                } else if (e.getSource() == colorButton) {
                    buttonPanel.setBackground(color.BLUE); 
                    //sets the backgorund to Blue
                } else {
                    leftButton.setAlignmentX(Component.CENTER_ALIGNMENT); 
                    //sets the location to previous location
                    colorButton.setAlignmentX(Component.CENTER_ALIGNMENT);
                    resetButton.setAlignmentX(Component.CENTER_ALIGNMENT);
                }

            }
        }
    }

    public static void main(String[] args) {
        Buttons buttonwindow = new Buttons();
    }
}
4

3 に答える 3

1

1 つの称賛を削除したため、コンパイルが停止したため、メソッドのすぐ上に 1 つの称賛 "}" を追加します。

public static  void main(String[] args)

コードがコンパイルされるはずです。フィードバックをお願いします。

編集:

また、メイン メソッドを次のように書き換えます。

public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        Buttons buttonwindow = new Buttons();
                    }
                }
            );           
    }

Swing コンポーネントのすべての使用は、Event Dispatch Thread (略してEDT ) を介して行う必要があります。そうしないと、望ましくない視覚効果が得られる可能性があります。解説はこちらをご覧ください。

編集^ 2:

目的の動作を実現するには、アクション リスナーを次のように書き換えます。

if (e.getSource() == leftButton)  {
    ((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.LEFT); //1
    buttonPanel.revalidate(); //2
}
else if (e.getSource() == colorButton) {
    buttonPanel.setBackground(color.BLUE); 
} 
else {
    ((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.CENTER);
    buttonPanel.revalidate();
}

Swing コンポーネントの視覚的な外観の変更は、割り当てられたレイアウト マネージャー (この場合はFlowLayout - 1 行目) を介して行う必要があります。

変更を確認するには、コンポーネントを再配置するように Swing コンポーネントのレイアウト マネージャーに通知する必要があります。2 行目では、revalidate()メソッドがレイアウト マネージャーに新しい位置を再計算するよう「通知」し、最終的に EDT にそれを画面に描画するよう「通知」します。

于 2012-10-13T11:48:53.877 に答える
1

main静的メソッドが内部クラス内にあるため、コードはコンパイルされませんeventHandle。外部クラスのクラス本体に移動するだけで修正できますButtons

クラスレベルですべてのオブジェクト参照があるため、たとえば次のようにボタンの配置を行うことができます。

flt.setAlignment(FlowLayout.RIGHT);
buttonPanel.revalidate();
...

ここでは、レイアウトの配置を調整FlowLayoutし、更新された変更をパネルに視覚的に反映するように再検証しています。

于 2012-10-13T11:49:25.377 に答える
1

コンポーネントを左または右に配置するには、レイアウト マネージャーを更新する必要があります。次のようなものを試してください。

((FlowLayout)getLayout()).setAlignment(FlowLayout.LEFT);

その代わり

于 2012-10-13T11:50:14.003 に答える