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

时间:2015-11-14 16:03:53

标签: java jframe

我试图设计一个简单的GUI,但无论我做什么,我添加到JFrame的每个面板都会变成相同的,不可更改的大小。我尝试了各种不同的布局,但它们都没有帮助。我究竟做错了什么?此外,当我使我的桌子可滚动时,这也没有用。它看起来像这样:

Screenshot of program

完整代码:

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()
    {

    }

}

2 个答案:

答案 0 :(得分:1)

  

无论我做什么,我添加到JFrame的每个面板都会变成相同的,不可更改的大小。

setLayout(new GridLayout(1,3));

这是因为您正在使用GridLayout(),它使每个组件的大小相同。如果您不希望发生这种情况,请不要使用GridLayout。

阅读Swing教程Using Layout Managers中的部分,了解使用每个布局管理器的示例。

  

此外,当我使我的桌子可滚动时,这也没有用。它看起来像这样:

表格没有理由可滚动,因为所有行都是可见的。

不知道你想要做什么,但我建议你只使用JFrame的默认BorderLayout。然后你的代码可能是这样的:

frame.add(buttonsPanel, BorderLayout.LINE_START);
frame.add(scrollPaneWithTable, BorderLayout.CENTER);
frame.add(blackPanel, BorderLayout,LINE_START);

答案 1 :(得分:1)

与Swing问题无关,innerRightPanel.setSize((2^numV)*5,5);可能没有设置您认为的大小 - ^运算符是Java中的Bitwise XOR,而不是指数。
将width参数更改为(int)Math.pow(2,numV)*5