4

私はSwingを学んでいて、練習として自分用のサンプルGUIを作成しました。非常に基本的で、の西側、中央側、および東側に3つのパネルがありJFrameます。最後のパネルには、別のパネルとボタンがあります。パネルは、の私の拡張JPanelですDrawPanelその下のボタンRectangleがクリックされるたびにランダムに描画されます。これは私のコードです:

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

public class Tester
{
    public static DrawPanel panelEastDrawPanelCenter;

    public static void main()
    {
        Tester gui = new Tester();
        gui.go();
    }
    public void go()
    {
        JFrame frame = new JFrame("This is the title");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create all the Western Panel components
        JPanel panelWest = new JPanel();
        //    panelWest.setLayout(new BorderLayout());
        JButton panelWestButtonWest = new JButton("Western-most West Button");
        JButton panelWestButtonCenter = new JButton("Western-most Center Button");
        JButton panelWestButtonEast = new JButton("Western-most East Button");

        // Create all Center Panel components
        JPanel panelCenter = new JPanel();
            panelCenter.setBackground(Color.darkGray);
        JButton panelCenterButtonCenter = new JButton("Center Button");

        // Create all East Panel components
        JPanel panelEast = new JPanel();
        panelEastDrawPanelCenter = new DrawPanel();
            panelEastDrawPanelCenter.setSize(50,50);
        JButton panelEastButtonSouth = new JButton("Repaint");
            panelEastButtonSouth.addActionListener(new panelEastButtonSouthListener());

        // Add everything to the GUI
        // West Panel
        frame.getContentPane().add(BorderLayout.WEST, panelWest);
        panelWest.add(BorderLayout.WEST, panelWestButtonWest);
        panelWest.add(BorderLayout.CENTER, panelWestButtonCenter);     
        panelWest.add(BorderLayout.EAST, panelWestButtonEast);

        // Center Panel
        frame.getContentPane().add(BorderLayout.CENTER, panelCenter);
        panelCenter.add(BorderLayout.CENTER, panelCenterButtonCenter);

        // East Panel
        frame.getContentPane().add(BorderLayout.EAST, panelEast);
        panelEast.add(panelEastDrawPanelCenter);
        panelEast.add(panelEastButtonSouth);

        frame.pack();
        //frame.setSize(frame.getWidth(), 500);
        frame.setVisible(true);
    }
    class panelEastButtonSouthListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            panelEastDrawPanelCenter.repaint();
        }
    }
    class DrawPanel extends JPanel // JPanel that displays a rectangle upon clicking the button "Repaint"
    {
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.WHITE); // Removes previous rectangle
            g.fillRect(0,0, this.getWidth(),this.getHeight());

            g.setColor(randColor()); // Puts a new rectangle on screen, rand size and color
            int height = (int)(Math.random() * this.getHeight());
            int width = (int)(Math.random() * this.getHeight());
            int x = (int)(Math.random() * 20);
            int y = (int)(Math.random() * 20);
            g.fillRect(x,y, height,width);
        }
        public Color randColor()
        {
            int r = (int)(Math.random() * 255);
            int g = (int)(Math.random() * 255);
            int b = (int)(Math.random() * 255);
            return new Color(r, g, b);
        }
    }
}

私が遭遇している問題はsetSize()DrawPanelオブジェクト(panelEastDrawPanelCenter)を50×50に明示的に指定しているにもかかわらず、プログラムを実行すると、それ(DrawPanel)がボタンの横にある小さなパネルであり、panelEast(およびDrawPanelボタンのコンテナー)がまだ残っていることです。同じ幅(そして決して広くなることはありません)。私は私が言うことができることを理解しています

frame.pack();
frame.setSize(frame.getWidth(), 500);

イーストパネルをまたはのいずれかのレイアウトを使用するように設定するBorderLayoutBoxLayoutDrawPanel表示が大きくなります。

  1. DrawPanelしかし、オブジェクトのサイズを設定しても実際にはサイズが変更されない理由と、私が行ってもオブジェクトが小さいままである理由はわかりません。setSize(50,50);
  2. 中央のパネルのサイズ変更を停止して、東側のパネルのサイズを変更して幅を広くできるようにするにはどうすればよいですか?または、Eastパネルのサイズを変更するにはどうすればよいですか?
4

3 に答える 3

8

BorderLayoutは、その西および東コンポーネントの優先幅を尊重します。そして、それはその中心コンポーネントの好ましい幅と高さを尊重します。したがって、DrawPanelはgetPreferredSize()、適切な優先サイズをオーバーライドして返す必要があります。

南コンポーネントもあるBorderLayoutの中央に配置されるため、東パネルの推奨幅は、描画パネルとボタンの推奨幅の最大値になります。

于 2012-06-19T07:59:30.900 に答える
2

使ってみましたかpanel.setPerferredSize(Dimension size);

于 2012-06-19T07:58:10.583 に答える
2

setPreferredSize(Dimension)の代わりにメソッドを試して、その後をsetSize(int, int)呼び出します。pack()

于 2012-06-19T07:58:56.713 に答える