我的布局键盘上的空格按钮大小不会调整大小

时间:2023-05-05
本文介绍了我的布局键盘上的空格按钮大小不会调整大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

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

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.

这篇关于我的布局键盘上的空格按钮大小不会调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:在 Java 中检测和操作键盘方向键 下一篇:Double 的 JFormattedTextField 仍然需要字符

相关文章