布局键盘上的空格按钮大小不会resize

我正在开发一个包含键盘的打字应用程序但我发现有点难以重新调整空间按钮的大小,使其比其他按钮更宽..这是我显示和组织我的布局的方式..

我可以调整整个按钮的大小,但它不是我想要的..整点就是调整空格键… 🙂

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[]={" " ,"" }; 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 

好吧,如果你们中的任何一个人可以引导我,我将非常感激,如果你们需要任何澄清或更多信息,请告诉我.. 🙂

pack()所做的是使用组件的首选大小来打包框架。 你在做什么是添加组件和设置它们的首选大小之前 pack() ,所以pack()对于在调用之后添加的组件是无关紧要的(就首选大小而言。所以你添加所有之后 pack()框架组件并设置其首选大小。

您需要考虑的另一件事是GridLayout 不会尊重组件的首选大小。 它实际上会使它们大小相同。

请参阅此处以查看哪些布局管理器遵循首选尺寸。 并相应地重构您的代码。 我会像MadProgrammer建议的那样研究GridBagLayout ,这样你就可以使用一个布局管理器。 如果你没有经验,这有点棘手。 另一种选择就是坚持使用JPanel的默认FlowLayout和嵌套面板。

另请参阅在容器中布置组件以了解可用的布局管理器以及它们的工作热点。

有两个问题,一个是你在实际构建内容之前调用packpack使用内容首选大小来计算窗口的大小,这会导致问题,因为内容的(潜在)大小将与您想要的大小不同。 它的工作原理是使用你之前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会很好;但是