(Gridbag Layout)图形组件被剪切到另一个网格中,不确定为什么

时间:2017-12-06 07:36:59

标签: java swing jframe jpanel gridbaglayout

这是我的JFrame的预期设计:

enter image description here

实现起来很容易,有一些按钮,文本字段,标签和选择列表。

左上方还有一个黄色框,称为"图形"。我对如何使用不太熟悉。

为了制作类似于上面的内容,我想使用一个网格布局。

这是我在遇到问题之前能够产生的:

enter image description here

标签red:,文本框和 - / +按钮全部位于第1列(gridy = 1;)。

当我在第0行col 0(gridwidth = 4)上添加我的图形时,我预计它会超过这些元素(因为0小于1)。可悲的是,这不是我得到的,它令人沮丧,因为我不知道为什么它这样做。

我的结果:

enter image description here

就像我之前说的那样,我对JFrames没有太多经验。我非常感谢有经验和帮助解决这个原因并解释原因。

这是我的源代码:

(1/2):

package colorSamplerApp;

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



public class WindowApplication extends JFrame {
    final static boolean shouldFill = true;
    final static boolean shouldWeightX = true;
    final static boolean RIGHT_TO_LEFT = false;

    protected static JLabel redLabel;
    protected static JLabel greenLabel;
    protected static JLabel blueLabel;

    protected static JTextField redTextField;
    protected static JTextField greenTextField;
    protected static JTextField blueTextField;

    protected static JButton redButtonM;
    protected static JButton greenButtonM;
    protected static JButton blueButtonM;

    protected static JButton redButtonP;
    protected static JButton greenButtonP;
    protected static JButton blueButtonP;

    protected static JButton saveButton;
    protected static JButton resetButton;

    protected static JList listColors;

    protected static DrawingTester drawTest;



    public static void addComponentsToPane(Container pane) 
    {
        if (RIGHT_TO_LEFT) {
            pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }


        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        if (shouldFill) {
        //natural height, maximum width
        c.fill = GridBagConstraints.HORIZONTAL;
        }


        /**
         * Setup the RGB Labels
         * 
         * R <0,1>
         * G <0,2>
         * B <0,3>
         * 
         */

        c.insets = new Insets(0,10,0,5);

        c.gridwidth = 1;
        redLabel = new JLabel("Red:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 1;
        pane.add(redLabel, c);

        greenLabel = new JLabel("Green:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 2;
        pane.add(greenLabel, c);

        blueLabel = new JLabel("Blue:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 3;
        pane.add(blueLabel, c);

        /**
         * Setup the RGB Text Fields
         * 
         * R<1,1>
         * G<1,2>
         * B<1,3>
         * 
         */


        c.insets.set(0, 0, 0, 5);

        redTextField = new JTextField("255");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridy = 1;
        pane.add(redTextField, c);

        greenTextField = new JTextField("0");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridy = 2;
        pane.add(greenTextField, c);

        blueTextField = new JTextField("0");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridy = 3;
        pane.add(blueTextField, c);

        /**
         * Setup the RGB (-) Button Fields
         * 
         * R<2,1>
         * G<2,2>
         * B<2,3>
         * 
         */

        c.insets.set(5,5,0,10);

        redButtonM = new JButton("-");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 2;
        c.gridy = 1;
        pane.add(redButtonM, c);

        greenButtonM = new JButton("-");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 2;
        c.gridy = 2;
        pane.add(greenButtonM, c);

        blueButtonM = new JButton("-");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 2;
        c.gridy = 3;
        pane.add(blueButtonM, c);

        /**
         * Setup the RGB (+) Button Fields
         * 
         * R<3,1>
         * G<3,2>
         * B<3,3>
         * 
         */

        c.insets.set(5,0,0,10);

        redButtonP = new JButton("+");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 3;
        c.gridy = 1;
        pane.add(redButtonP, c);

        greenButtonP = new JButton("+");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 3;
        c.gridy = 2;
        pane.add(greenButtonP, c);

        blueButtonP = new JButton("+");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 3;
        c.gridy = 3;
        pane.add(blueButtonP, c);

        /**
         * Setup the Save/Reset Buttons
         * 
         * save <0,4>
         * reset<1,4>
         * 
         */

        c.insets.set(10,10,10,5);

        saveButton = new JButton("Save");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 10;      //make this component tall
        c.ipadx = 10;
        //c.weightx = 0.0;
        c.gridwidth = 2;
        c.gridx = 0;
        c.gridy = 4;
        pane.add(saveButton, c);


        c.insets.set(10,5,10,10);

        resetButton = new JButton("Reset");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 10;      
        c.ipadx = 10;
        //c.weighty = 1.0;   //request any extra vertical space
        //c.anchor = GridBagConstraints.PAGE_END; //bottom of space
        c.gridx = 2;       //aligned with button 2
        c.gridwidth = 2;   //2 columns wide
        c.gridy = 4;       //third row
        pane.add(resetButton, c);

        /**
         * Setup the Color Selection List
         * 
         * <4,0>
         * 
         */

        c.insets.set(10,0,10,10);

        listColors = new JList();
        /**
            File reading shenanigans to fill up the list
        */
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 150;       
        c.ipadx = 100;
        //c.weighty = 1.0;   //request any extra vertical space
        //c.anchor = GridBagConstraints.PAGE_END; //bottom of space
        c.gridx = 4;       //aligned with button 2
        c.gridheight = 5;   //2 columns wide
        c.gridy = 1;       //third row
        pane.add(listColors, c);

        /**
         * Setup the Graphics
         * 
         * <0,0>
         * 
         */

        drawTest = new DrawingTester();
        c.insets.set(0,0,0,0);
        c.gridx = 0;       //top leftw
        c.gridy = 0;       //bottom
        c.gridwidth = 0 ;
        pane.add(drawTest,c);
    }


    public static void main (String argv[])
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI("Color Sampler");
            }
        });
    }

    public static void createAndShowGUI(String title)
    {
        // Create and setup the window
        JFrame frame = new JFrame (title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setup the content pane
        addComponentsToPane(frame.getContentPane());

        // Display the window
        frame.pack();
        frame.setVisible(true);

    }


}

(2/2)

package colorSamplerApp;

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

import javax.swing.JComponent;

public class DrawingTester extends JComponent {

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(0,0, 170, 70);   
    }
}

1 个答案:

答案 0 :(得分:3)

您遇到的问题与重用相同的10对象有关。很常见的一个,是处理这种布局的痛苦之一。

首先,我已注释掉所有更改GridBagConstraints的来电。

然后,我确保insetsgridx设置正确。另外,将gridygridheight视为组件将要采用的网格中的单元格数量,不要考虑实际gridwidth和{{1}您放置在单元格中的内部组件。

width中,我也确保我们正在绘制整个事物。

查看代码和结果:

height

查看结果:

enter image description here

从那时起,您应该能够继续更改它以满足您的需求,例如取回所有DrawingTester并更改组件的import java.awt.*; import javax.swing.*; public class WindowApplication extends JFrame { final static boolean shouldFill = true; final static boolean shouldWeightX = true; final static boolean RIGHT_TO_LEFT = false; protected static JLabel redLabel; protected static JLabel greenLabel; protected static JLabel blueLabel; protected static JTextField redTextField; protected static JTextField greenTextField; protected static JTextField blueTextField; protected static JButton redButtonM; protected static JButton greenButtonM; protected static JButton blueButtonM; protected static JButton redButtonP; protected static JButton greenButtonP; protected static JButton blueButtonP; protected static JButton saveButton; protected static JButton resetButton; protected static JList listColors; protected static DrawingTester drawTest; public static void addComponentsToPane(Container pane) { if (RIGHT_TO_LEFT) { pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); } pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); if (shouldFill) { //natural height, maximum width c.fill = GridBagConstraints.HORIZONTAL; } /** * Setup the RGB Labels * * R <0,1> * G <0,2> * B <0,3> * */ // c.insets = new Insets(0,10,0,5); c.gridwidth = 1; redLabel = new JLabel("Red:"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 1; pane.add(redLabel, c); greenLabel = new JLabel("Green:"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 2; pane.add(greenLabel, c); blueLabel = new JLabel("Blue:"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 3; pane.add(blueLabel, c); /** * Setup the RGB Text Fields * * R<1,1> * G<1,2> * B<1,3> * */ // c.insets.set(0, 0, 0, 5); redTextField = new JTextField("255"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridy = 1; pane.add(redTextField, c); greenTextField = new JTextField("0"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridy = 2; pane.add(greenTextField, c); blueTextField = new JTextField("0"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridy = 3; pane.add(blueTextField, c); /** * Setup the RGB (-) Button Fields * * R<2,1> * G<2,2> * B<2,3> * */ // c.insets.set(5,5,0,10); redButtonM = new JButton("-"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 2; c.gridy = 1; pane.add(redButtonM, c); greenButtonM = new JButton("-"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 2; c.gridy = 2; pane.add(greenButtonM, c); blueButtonM = new JButton("-"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 2; c.gridy = 3; pane.add(blueButtonM, c); /** * Setup the RGB (+) Button Fields * * R<3,1> * G<3,2> * B<3,3> * */ // c.insets.set(5,0,0,10); redButtonP = new JButton("+"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 3; c.gridy = 1; pane.add(redButtonP, c); greenButtonP = new JButton("+"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 3; c.gridy = 2; pane.add(greenButtonP, c); blueButtonP = new JButton("+"); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 3; c.gridy = 3; pane.add(blueButtonP, c); /** * Setup the Save/Reset Buttons * * save <0,4> * reset<1,4> * */ saveButton = new JButton("Save"); c.insets.set(10,10,10,5); c.fill = GridBagConstraints.HORIZONTAL; c.ipady = 10; //make this component tall c.ipadx = 10; //c.weightx = 0.0; c.gridwidth = 2; c.gridx = 0; c.gridy = 4; pane.add(saveButton, c); resetButton = new JButton("Reset"); c.insets.set(10,5,10,10); c.fill = GridBagConstraints.HORIZONTAL; c.ipady = 10; c.ipadx = 10; //c.weighty = 1.0; //request any extra vertical space //c.anchor = GridBagConstraints.PAGE_END; //bottom of space c.gridx = 2; //aligned with button 2 c.gridwidth = 2; //2 columns wide c.gridy = 4; //third row pane.add(resetButton, c); /** * Setup the Color Selection List * * <4,0> * */ c.insets.set(5,5,5,5); listColors = new JList(new Object[] {"Test 1", "Test 2", "Test 3"}); /** File reading shenanigans to fill up the list */ c.fill = GridBagConstraints.BOTH; c.gridy = 0; c.gridx = 4; c.gridheight = 5; c.gridwidth = 1; pane.add(listColors, c); /** * Setup the Graphics * * <0,0> * */ drawTest = new DrawingTester(); c.insets = new Insets(5,5,5,5); c.fill = GridBagConstraints.BOTH; c.gridx = 0; //top leftw c.gridy = 0; //bottom c.gridheight = 1; c.gridwidth = 4; pane.add(drawTest,c); } public static void main (String argv[]) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI("Color Sampler"); } }); } public static void createAndShowGUI(String title) { // Create and setup the window JFrame frame = new JFrame (title); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Setup the content pane addComponentsToPane(frame.getContentPane()); // Display the window frame.pack(); frame.setVisible(true); } } class DrawingTester extends JComponent { public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.red); g.fillRect(0,0, g.getClipBounds().width, g.getClipBounds().height); } } insets。请注意,您正在重复使用height,因此您必须要小心。如果您不确定,只需实例化一个新的并测试您的代码。