我试图设计一个简单的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()
{
}
}
答案 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
。