问题描述
我正在开发一个包含键盘的打字应用程序,但我发现调整空格按钮的大小以使其比其他按钮更宽有点困难.这就是我显示和组织布局的方式..
I am working on a typing app which includes the a keyboard but I have found a bit hard to re-size the space button to make it wider than the other buttons.. This is the way I am displaying and organizing my layout..
我可以调整整个按钮的大小,但这不是我想要的.. 重点是调整空格键的大小.. :)
I can resize the whole buttons but its NOT what I want.. the whole point is to be resize just the space bar.. :)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class example extends JFrame
{
//Individual keyboard rows
String firstRow[] = {"~","1","2","3","4","5","6","7","8","9","0","-","+","BackSpace"};
String secondRow[] = {"Tab","Q","W","E","R","T","Y","U","I","O","P","[","]","\"};
String thirdRow[] = {"Caps","A","S","D","F","G","H","J","K","L",":",""","Enter"};
String fourthRow[] = {"Shift","Z","X","C","V","B","N","M",",",".","?"," ^" };
String fifthRow[]={" " ,"<" ,"v",">" };
String strText = "";
//all keys without shift key press
String noShift="`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./";
//special characters on keyboard that has to be addressed during key press
String specialChars ="~-+[]\;',.?";
//Jbuttons corresponding to each individual rows
JButton first[];
JButton second[];
JButton third[];
JButton fourth[];
JButton fifth[];
//Driver main method to start the application
public static void main(String[] args) {
//launch typing tutor
new example().setVisible(true);
}
// No argument constructor to create frame
public example()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set size of the content pane ie frame
this.getContentPane().setPreferredSize(new Dimension(1200,275));
initWidgets();
}
// Method to initialize frame component
private void initWidgets()
{
//set the layout and place component in place and pack it
setLayout(new BorderLayout());
//Various panel for the layout
JPanel jpNorth = new JPanel();
JPanel jpCenter = new JPanel();
JPanel jpKeyboard = new JPanel();
JPanel jpNote = new JPanel();
add( jpNorth, BorderLayout.NORTH);
add( jpNote);
add( jpCenter, BorderLayout.CENTER);
add(jpKeyboard, BorderLayout.SOUTH);
//layout for keyboard
jpKeyboard.setLayout(new GridLayout(5,1));
//pack the components
pack();
//paint first keyboard row and add it to the keyboard
first = new JButton[firstRow.length];
//get the panel for the row
JPanel p = new JPanel(new GridLayout(1, firstRow.length));
for(int i = 0; i < firstRow.length; ++i)
{
JButton b= new JButton(firstRow[i]);
b.setPreferredSize(new Dimension(100,50));
first[i] = b;
p.add(first[i]);
}
jpKeyboard.add(p);
//paint second keyboard row and add it to the keyboard
second = new JButton[secondRow.length];
//get the panel for the row
p = new JPanel(new GridLayout(1, secondRow.length));
for(int i = 0; i < secondRow.length; ++i)
{
second[i] = new JButton(secondRow[i]);
p.add(second[i]);
}
jpKeyboard.add(p);
//paint third keyboard row and add it to the keyboard
third = new JButton[thirdRow.length];
//get the panel for the row
p = new JPanel(new GridLayout(1, thirdRow.length));
for(int i = 0; i < thirdRow.length; ++i)
{
third[i] = new JButton(thirdRow[i]);
p.add(third[i]);
}
jpKeyboard.add(p);
//paint fourth keyboard row and add it to the keyboard
fourth = new JButton[fourthRow.length];
//get the panel for the row
p = new JPanel(new GridLayout(1, fourthRow.length));
for(int i = 0; i < fourthRow.length; ++i)
{
fourth[i] = new JButton(fourthRow[i]);
p.add(fourth[i]);
if(i==fourthRow.length-2)
p.add(new JPanel());
}
p.add(new JPanel());
jpKeyboard.add(p);
//paint the fifth row
fifth = new JButton[fifthRow.length];
//get the panel for the row
p = new JPanel(new GridLayout(1, fifthRow.length));
//put empty panel for layout adjustments
for(int i = 0; i < 1; ++i)
{
JPanel spacePanel = new JPanel();
p.add(spacePanel);
}
//draw the buttons
for(int i = 0; i < fifthRow.length; ++i)
{
if(i==1) //space bar panel
{
JButton b = new JButton(fifthRow[i]);
b.setPreferredSize(new Dimension(400,10));
b.setBounds(10, 10, 600, 100);
fifth[i]=b;
//add empty panels for layout
p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());
}
else
{
fifth[i]=new JButton(fifthRow[i]);
}
if(i==0) //first black panel
{
//place a black panel at first
JPanel spacePanel = new JPanel();
p.add(spacePanel);
}
p.add(fifth[i]);
}
jpKeyboard.add(p);
} //end of initWidgets
}//end of class
好吧,如果你们中的任何人可以指导我,我将非常感激,如果你们需要任何澄清或更多信息,请告诉我.. :)
Well, if any of you guys can walk me through I will really appreciate it and if you guys need any clarification or more info please just let me know.. :)
推荐答案
pack()
所做的是使用组件的首选大小来打包框架.您正在做的是 pack()
ing before 添加组件并设置它们的首选大小,因此 pack()
对组件无关紧要在调用之后添加(就首选尺寸而言.所以 pack()
框架 after 您添加所有组件并设置它们的首选尺寸.
What pack()
does is pack the frame, using the preferred sizes of the components. What you are doing is pack()
ing before add the components and setting their preferred sizes, so the pack()
is insignificant to the components added after the call (in terms of preferred size. So pack()
the frame after you add all the components and set their preferred sizes.
您需要考虑的另一件事是 GridLayout
不会尊重组件的首选大小.它实际上会使它们的大小都相同.
Another thing you need to consider is that GridLayout
will not respect the preferred size of the components. It will actually make them all the same size.
请参阅此处了解哪些布局管理器将尊重首选尺寸.并相应地重组你的代码.我会按照 MadProgrammer 的建议研究 GridBagLayout
,这样您就可以只使用一个布局管理器.如果你没有这方面的经验,这有点棘手.另一种选择是坚持使用 JPanel
的默认 FlowLayout
并像您所做的那样嵌套面板.
See here to see which layout managers will respect preferred sizes. And restructure your code accordingly. I'd look into a GridBagLayout
as MadProgrammer suggest, that way you can just use one layout manager. It's a little tricky if you have no experience with it. Another option is just to stick with the default FlowLayout
of the JPanel
and nest panels as you have done.
另请参阅在容器中布置组件了解可用的布局管理器以及它们的工作原理.
Also see Laying out Components Within a Container to learn about the layout mangers available and hot they work.
这篇关于我的布局键盘上的空格按钮大小不会调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!