0

問題と質問は 50-51 行にあります。

package exercise1;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MainFrame extends JFrame {

    // -------------------------------------------------------------------------

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.pack();
        frame.setVisible(true);
    }

    public MainFrame() {
        this.setTitle("Exercise 1");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocation(300, 200);
        this.getContentPane().setPreferredSize(new Dimension(400, 150));
        this.getContentPane().setLayout(null);
        this.initContent();
    }

    // -------------------------------------------------------------------------

    private final JButton btnCombine = new JButton();

    private void initContent() {
        this.add(btnTest);
        btnTest.setText("Change Size");
        btnTest.setSize(100, 25);
        btnTest.setLocation(150, 100);
        btnTest.addActionListener(action);
    }

    // -------------------------------------------------------------------------

    private final Controller action = new Controller();

    private class Controller implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
                if (e.getSource() == btnTest) {
                    //CHANGE THE WINDOWS SIZE HERE;
                                        MainFrame.getContentPane().setPreferredSize(new Dimension(100, 200));
                }
        }
    }
}

このようなコードがある場合、ウィンドウのサイズを変更するにはどうすればよいですか?

1つ条件があります。ボタンのクリックでサイズを変更したいです。この例では: ボタン btnTest をクリックすると、他のサイズに関係なくウィンドウのサイズが変更されます。

ありがとう!:)

4

2 に答える 2

2

受け入れられた回答についてさらに批判するのではなく、私の言いたいことを示す方がよいと判断しました(「コードを口に入れる」)。詳細については、ソースのコメントを参照してください。

大きい 小さな

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

public class MainFrame extends JFrame {

    JButton btnTest;
    JPanel btnContainer;

    // ---------------------------------------------------------------

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                JFrame frame = new MainFrame();
                frame.pack();
                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }

    public MainFrame() {
        this.setTitle("Exercise 1");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setLocation(300, 200);  BETTER TO..
        this.setLocationByPlatform(true);
        // THESE NUMBERS ARE NOT MUCH BETTER THAN 'MAGIC NUMBERS'
        //this.getContentPane().setPreferredSize(new Dimension(400, 150));
        // DON'T DO THIS - IT WILL CAUSE MORE PROBLEMS THAN IT FIXES
        //this.getContentPane().setLayout(null);
        this.initContent();
    }

    // ---------------------------------------------------------------

    private final JButton btnCombine = new JButton();

    private void initContent() {
        btnTest = new JButton("Change Size");
        //btnTest.setSize(100, 25);  DON'T GUESS COMPONENT SIZES!
        //btnTest.setLocation(150, 100); ADD A BORDER INSTEAD!
        // WE ACTUALLY ADD THE BORDER TO A CONTAINER THAT HOLDS THE BUTTON.
        // THIS WAY IT RETAINS THE USUAL BORDERS ON FOCUS, PRESS ETC.
        btnContainer = new JPanel(new GridLayout());
        btnContainer.add(btnTest);
        btnContainer.setBorder(new EmptyBorder(100,150,100,150));
        btnTest.addActionListener(action);
        add(btnContainer);
    }

    // ---------------------------------------------------------------

    private final Controller action = new Controller();

    private class Controller implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnTest) {
                //CHANGE THE WINDOWS SIZE HERE;
                btnContainer.setBorder(new EmptyBorder(30,20,30,20));
                MainFrame.this.pack();
            }
        }
    }
}

一般的なヒント

2 番目のポイントは、上記のソースで実装されています。1 番目は、読者の演習として残しておきます。

  1. フレームまたは他の最上位のコンテナーを拡張しないでください。代わりに、1 つのインスタンスを作成して使用します。
  2. Java GUI は、さまざまな画面解像度やさまざまな PLAF を使用するさまざまなプラットフォームで動作する必要がある場合があります。そのため、コンポーネントを正確に配置するのに役立ちません。堅牢な GUI のコンポーネントを整理するには、代わりにレイアウト マネージャー、またはそれらの組み合わせを使用し、空白のレイアウト パディングと境界線を使用します。

    Java GUI は、さまざまな画面解像度やさまざまな PLAF を使用するさまざまなプラットフォームで動作する必要がある場合があります。そのため、コンポーネントを正確に配置するのに役立ちません。堅牢な GUI のコンポーネントを整理するには、代わりにレイアウト マネージャー、またはそれらの組み合わせ1を、余白のレイアウト パディングと境界線と共に使用します2



于 2013-10-02T11:36:29.743 に答える
0

行を変更する

MainFrame.getContentPane().setPreferredSize(new Dimension(100, 200));

setSize(new Dimension(100, 200));

setSize外部クラス オブジェクト (メイン フレーム) でメソッドを呼び出す必要があります。

于 2013-10-02T09:10:08.253 に答える