我正在开发一个包含键盘的打字应用程序,但我发现有点难以重新调整空间按钮的大小,使其比其他按钮更宽..这就是我显示和组织布局的方式..
我可以调整整个按钮的大小,但它不是我想要的......整点就是调整空格键...:)
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
好吧,如果你们中的任何一个人可以引导我,我将非常感激,如果你们需要任何澄清或更多信息,请告诉我们.. :)
答案 0 :(得分:6)
有两个问题,一个是你在实际构建内容之前调用pack
。 pack
使用内容首选大小来计算窗口的大小,这会导致问题,因为内容的(潜在)大小将与您想要的大小不同。它的工作原理取决于你之前调用过的setPreferredSize
,你应该避免这样做。
第二个问题是布局管理器的选择。 GridLayout
将根据父容器的可用空间为容器内的每个组件提供相等的空间,水平和垂直。
更好的解决方案可能是使用GridBagLayout
,例如。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Example extends JFrame {
//Individual keyboard rows
String firstRow[] = {"~", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "+", "fill", "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", ":", "\"", "fill", "fill", "Enter"};
String fourthRow[] = {"Shift", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "?", "blank", "^"};
String fifthRow[] = {"blank", "blank", "fill", "fill", "fill", "fill", "fill", "fill", "fill", "fill", "", "<", "v", ">"};
//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) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new Example().setVisible(true);
}
});
}
// No argument constructor to create frame
public Example() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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(new GridBagLayout());
JPanel jpNote = new JPanel();
add(jpNorth, BorderLayout.NORTH);
add(jpNote);
add(jpCenter, BorderLayout.CENTER);
add(jpKeyboard, BorderLayout.SOUTH);
first = new JButton[firstRow.length];
second = new JButton[secondRow.length];
third = new JButton[thirdRow.length];
fourth = new JButton[fourthRow.length];
fifth = new JButton[fifthRow.length];
addKeys(jpKeyboard, 0, firstRow, first);
addKeys(jpKeyboard, 1, secondRow, second);
addKeys(jpKeyboard, 2, thirdRow, third);
addKeys(jpKeyboard, 3, fourthRow, fourth);
addKeys(jpKeyboard, 4, fifthRow, fifth);
pack();
} //end of initWidgets
protected void addKeys(JPanel parent, int row, String[] keys, JButton[] buttons) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = row;
gbc.gridx = 0;
gbc.fill = GridBagConstraints.BOTH;
int gap = 0;
for (int index = 0; index < keys.length; index++) {
String key = keys[index];
if ("blank".equalsIgnoreCase(key)) {
gbc.gridx++;
} else if ("fill".equalsIgnoreCase(key)) {
gbc.gridwidth++;
gap++;
} else {
System.out.println("Add " + key);
JButton btn = new JButton(key);
buttons[index] = btn;
parent.add(btn, gbc);
gbc.gridx += gap + 1;
gbc.gridwidth = 1;
gap = 0;
}
}
}
}//end of class
如果你觉得这个答案很有用,我会很感激,如果你能把@ peeskillet的答案标记为正确,那么他先回答并发现了一些我没有的问题......但是upvote会很好;但是
答案 1 :(得分:4)
pack()
所做的是使用组件的首选大小打包框架。您正在做的是pack()
之前添加组件并设置其首选大小,因此pack()
对于在通话后添加的组件(在首选大小方面)无关紧要那么pack()
之后的框架你添加了所有组件并设置了它们的首选尺寸。
您需要考虑的另一件事是GridLayout
不会尊重组件的首选大小。它实际上会使它们大小相同。
请参阅here,了解哪些布局经理将尊重首选尺寸。并相应地重构您的代码。我会像MadProgrammer建议的那样调查GridBagLayout
,这样你就可以使用一个布局管理器。如果你没有经验,这有点棘手。另一种选择就是坚持使用FlowLayout
的默认JPanel
和嵌套面板。
另请参阅Laying out Components Within a Container了解可用的布局管理人员以及他们的工作热点。