Java 如何更改添加到JFrame的每个组件的大小?

Java 如何更改添加到JFrame的每个组件的大小?,java,jframe,Java,Jframe,我试图设计一个简单的GUI,但无论我做什么,我添加到JFrame的每个面板都会变成相同的、不可更改的大小。我尝试了各种不同的布局,但都没有用。我做错了什么?而且,当我使我的表格可滚动时,这也不起作用。看起来是这样的: 完整代码: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.GridLay

我试图设计一个简单的GUI,但无论我做什么,我添加到
JFrame
的每个面板都会变成相同的、不可更改的大小。我尝试了各种不同的布局,但都没有用。我做错了什么?而且,当我使我的表格可滚动时,这也不起作用。看起来是这样的:

完整代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class KMap extends JFrame
{
    private ArrayList<String> variableNameList = new ArrayList<String>();
    private String [] characters = {"A","B","C","D","E","F","G","H","I","J"};
    private ArrayList<int[]> values = new ArrayList<int[]>();
    private ArrayList<JButton> buttons = new ArrayList<JButton>();
    public KMap() 
    {
        setTitle("Karnaugh Map for COMP 228");
        setLayout(new GridLayout(1,3));
        createTopPane();
        updateVarialbes(4);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);
        setLocationRelativeTo(null);
    }
    public void createTopPane()
    {
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new GridLayout(10,1));
        JLabel numVariablesString = new JLabel();
        numVariablesString.setText("# Variables => ");
        topPanel.add(numVariablesString);
        JButton[] variableButton = new JButton[9];
        for(int i = 0; i < variableButton.length; i++)
        {
            int numV = i+2;
            variableButton[i] = new JButton();
            variableButton[i].setText(Integer.toString(numV));
            variableButton[i].addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) 
                {
                    removeLeftPane();
                    removeRightPane();
                    updateVarialbes(numV);
                    repaint();
                }
            });

            topPanel.add(variableButton[i]);
        }
        add(topPanel);
    }
    public void updateVarialbes(int numV)
    {
        int combinations = (int) Math.pow(2,numV);
        System.out.println(combinations);
        System.out.println("New variables: " + numV);
        values.clear();
        variableNameList.clear();
        for(int i = 0; i < numV; i++)
            variableNameList.add(characters[i]);
        System.out.println();

        for(int i = 0; i < combinations; i++)
        {
            int binary[] = new int[numV];
            if(i == 0)
                for(int j = 0; j < numV; j++)
                    binary[j] = 0;

            else
            {

                for(int z = 0; z < values.get(i-1).length; z++)
                    binary[z] = values.get(i-1)[z];

                for(int a = numV-1; a >= 0; a--)
                {
                    if(binary[a]==0)
                    {
                        binary[a]++;
                        break;
                    }
                    else
                        binary[a]=0;
                }
            }
            values.add(binary);

            for(int j = 0; j < values.get(i).length; j++)
                System.out.print(values.get(i)[j]);
            System.out.println();

        }

        createLeftPane(numV);
        createRightPane(numV);
        pack();
    }
    private JPanel leftPanel;
    public void createLeftPane(int numV)//numV = number of variables to display
    {
        leftPanel = new JPanel();
        leftPanel.setLayout(new BorderLayout());

        String leftColNames [] = new String[numV];
        Object[][] leftData = new Object[values.size()][numV];
        for(int i = 0; i < leftColNames.length; i++)
            leftColNames[i] = variableNameList.get(i);
        for(int i = 0; i < values.size(); i++)
            for(int j = 0; j < numV; j++)
                leftData[i][j] = new Integer(values.get(i)[j]);

        JTable leftTable = new JTable(leftData, leftColNames);

        JPanel innerRightPanel = new JPanel();
        String s = "F(";
        for(int i = 0; i < numV; i++)
        {
            s+=characters[i];
            if(i!=numV-1)
                s+=",";
        }
        s+=(")");
        System.out.println(s);


        for(int i = 0; i < values.size(); i++)
        {
            JButton btn = new JButton();
            btn.setText("0");
            btn.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, Color.WHITE));
            btn.addActionListener(new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent e) {
                    if(Integer.parseInt(btn.getText()) == 1)
                        btn.setText("0");
                    else
                        btn.setText("1");

                }

            });
            buttons.add(btn);
        }
        innerRightPanel.setLayout(new BoxLayout(innerRightPanel, BoxLayout.Y_AXIS));
        innerRightPanel.setSize((2^numV)*5,5);
        JLabel functionLabel = new JLabel();
        functionLabel.setText(s);
        innerRightPanel.add(functionLabel);
        for(int i = 0; i < buttons.size(); i++)
        {
            innerRightPanel.add(buttons.get(i));
        }


        JScrollPane leftScrollTable = new JScrollPane(leftTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        leftScrollTable.setMaximumSize(new Dimension(100, 100));
        leftPanel.add(leftScrollTable,BorderLayout.WEST);
        leftPanel.add(innerRightPanel,BorderLayout.EAST);
        add(leftPanel);

    }
    public void removeLeftPane()
    {
        remove(leftPanel);
    }
    public void createRightPane(int numV)
    {
        JPanel kPanel = new JPanel();
        kPanel.setSize(100,100);
        kPanel.setBackground(Color.BLACK);

        add(kPanel);
    }
    public void removeRightPane()
    {

    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridBagLayout;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
公共类KMap扩展JFrame
{
私有ArrayList variableNameList=新ArrayList();
私有字符串[]个字符={“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”、“J”};
私有ArrayList值=新ArrayList();
私有ArrayList按钮=新建ArrayList();
公共KMap()
{
setTitle(“组件228的卡诺图”);
setLayout(新网格布局(1,3));
createTopPane();
更新变量(4);
包装();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(真);
可设置大小(假);
setLocationRelativeTo(空);
}
公共空间
{
JPanel-topPanel=新的JPanel();
topPanel.setLayout(新网格布局(10,1));
JLabel numVariablesString=新的JLabel();
numVariablesString.setText(“#Variables=>”;
添加(numVariablesString);
JButton[]variableButton=新JButton[9];
对于(int i=0;i=0;a--)
{
if(二进制[a]==0)
{
二进制[a]++;
打破
}
其他的
二进制[a]=0;
}
}
值。添加(二进制);
for(int j=0;jsetLayout(new GridLayout(1,3));
frame.add(buttonsPanel, BorderLayout.LINE_START);
frame.add(scrollPaneWithTable, BorderLayout.CENTER);
frame.add(blackPanel, BorderLayout,LINE_START);