这是我的JFrame的预期设计:
实现起来很容易,有一些按钮,文本字段,标签和选择列表。
左上方还有一个黄色框,称为"图形"。我对如何使用不太熟悉。
为了制作类似于上面的内容,我想使用一个网格布局。
这是我在遇到问题之前能够产生的:
标签red:
,文本框和 - / +按钮全部位于第1列(gridy = 1;
)。
当我在第0行col 0(gridwidth = 4)上添加我的图形时,我预计它会超过这些元素(因为0小于1)。可悲的是,这不是我得到的,它令人沮丧,因为我不知道为什么它这样做。
我的结果:
就像我之前说的那样,我对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);
}
}
答案 0 :(得分:3)
您遇到的问题与重用相同的10
对象有关。很常见的一个,是处理这种布局的痛苦之一。
首先,我已注释掉所有更改GridBagConstraints
的来电。
然后,我确保insets
和gridx
设置正确。另外,将gridy
和gridheight
视为组件将要采用的网格中的单元格数量,不要考虑实际gridwidth
和{{1}您放置在单元格中的内部组件。
在width
中,我也确保我们正在绘制整个事物。
查看代码和结果:
height
查看结果:
从那时起,您应该能够继续更改它以满足您的需求,例如取回所有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
,因此您必须要小心。如果您不确定,只需实例化一个新的并测试您的代码。