1

ボタンをクリックしたときにボタンを移動したいだけでなく、ラベルのテキストを変更したいです。

ボタンを移動するためのコードを書きましたが、うまく機能しています。しかし、ラベルのテキストを別の名前に変更したい場合、それは起こりません。

ボタンがその場所から移動しているか、ラベルのテキストが変更されています。しかし、ボタンクリックイベントなど、両方のアクションを一度に実行したいです。できる限り多くのことを試しました。誰かが私を助けることができますか?

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JavaGUI extends JPanel {

    private Control control = new Control();
    private Keys keys = new Keys("Original starting value.");

    public JavaGUI() {        
        this.add(keys);
        this.add(control);
    }

    private class Control extends JPanel {

        public Control() {
            this.add(new JButton(new AbstractAction("Update") {

                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Command: " + e.getActionCommand());
                    keys.string = String.valueOf(System.nanoTime());
                    //keys.label.setText(keys.string);          
                    // If I remove these comments button will not move. bt I want both...
                    JButton j = (JButton) e.getSource();
            j.setLocation(j.getX()+10,j.getY()+10);
                }
            }));
        }
    }

    private class Keys extends JPanel {

        private String string;
        private JLabel label = new JLabel();

        public Keys(String s) {
            this.string = s;
            label.setText(s);
            this.add(label);
        }
    }

    private void display() {
        JFrame f = new JFrame("JavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JavaGUI().display();
            }
        });
    }
}
4

2 に答える 2

1

そのようにボタンを移動することはできません。レイアウト マネージャーがボタンの位置を指示します。setText を呼び出すと、コンポーネント階層全体に対してレイアウト マネージャーの効果がトリガーされます。本当にこれを行いたい場合は、null レイアウト マネージャーを設定し、すべてのコンポーネントのすべてのサイズと場所を手動で管理する必要があります。

ボタンが元のコードで動いていたとしても、元の場所を離れるとすぐに正しく描画されませんでした.Swingを誤って悪用する可能性がありますが、完全ではありません.

作業ソリューション:

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

public class MovingButton {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                buildFrame();
            }
        });
    }

    private static void buildFrame() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel p = new JPanel();
        p.setPreferredSize(new Dimension(500, 500));
        p.setLayout(null);

        final JLabel label = new JLabel("Starting Text on Label");
        label.setLocation(200, 0);
        label.setSize(label.getPreferredSize());
        p.add(label);

        final JButton b = new JButton("Button");
        b.setSize(b.getPreferredSize());
        b.setLocation(0, 0);
        p.add(b);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                b.setLocation((int)b.getLocation().getX() + 20, (int)b.getLocation().getY() + 20);
                label.setText(String.valueOf(System.nanoTime()));
            }
        });


        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
于 2013-01-09T16:45:58.763 に答える
1

JLabel を保持するクラスに、String を受け入れるパブリック メソッドを指定する必要があります。このメソッドは、他のオブジェクトがラベルに保持されているテキストを変更したい場合に呼び出されます。たとえば、次のようになります。

public void setLabelText(String text) {
   label.setText(text);
}

次に、JLabel表示オブジェクトへの参照を持つオブジェクトは、ラベルのテキストを簡単に変更できます。

移動するボタンについては、レイアウト マネージャーを参照してください。JPanels はデフォルトで FlowLayout を使用し、これはコンポーネントの setBounds(...) または setLocation(...) を受け入れません。

于 2013-01-09T16:46:18.777 に答える