Hvilken LayoutManager?
Jeg har lavet en "custom" komponent, som udvider JPanel ogpå denne komponent findes et antal JCheckBoxes og et antal
JLabels .. der er altid lige mange antal checkboxes og
labels ....
Det store problem i den måde komponenterne vises på, skyldes
højst sandynligt mit valg og min brug af LayoutManager.
Jeg bruger i øjeblikket en GridLayout();
this.setLayout(new GridLayout(numrows,8,2,2));
Med antal rækker bestemt af indholdet af numrows (selvfølgelig
det antal af checkboxes/labels jeg har i pågældende situation).
Min custom komponent "CustomCheckBoxClass" befinder sig i et
JScrollPane, som er placeret på min "main" screen, som er
et andet panel.
Jeg vil gerne have at min JCheckbox skal være en bestemt størrelse
hver gang og ikke skifte bredde, længde mv .... men som det ser ud
i øjeblikket, er dette ikke tilfældet ... desværre ... så jeg er
i tvivl om hvilken LayoutManager jeg skal bruge, eller kunne
jeg bare bruge setBounds ??? (det er måske mere besværligt).
Håber på lidt hjælp .. her er klassen:
/**
* A custom class that renders a checkbox and a label for choosing alternative compositions
* of meals.
*
*
*/
class CustomCheckBoxClass extends JPanel implements MouseListener, ActionListener {
private JCheckBox manyboxes[];
private JLabel labels[];
private Vector row2data;
private int selectedIndex=0;
private Boolean boxIsSelected;
CustomCheckBoxClass(Vector r2){
this.row2data=r2;
int numrows=r2.size();
this.setSize(150,300);
this.setLayout(new GridLayout(numrows,8,2,2));
//this.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER));
manyboxes=new JCheckBox[row2data.size()];
labels=new JLabel[row2data.size()];
for (int i=0;i<row2data.size();i++){
manyboxes[i]=new JCheckBox();
manyboxes[i].addActionListener(this);
labels[i]=new JLabel((row2data.get(i)).toString());
labels[i].addMouseListener(this);
add(manyboxes[i]);
add(labels[i]);
manyboxes[i].setSelected(true);
//manyboxes[i].setPreferredSize(new Dimension(1,1));
manyboxes[i].setBackground(Color.yellow);
}
}
private void addBoxes(java.awt.event.ActionEvent evt)
{
manyboxes=new JCheckBox[row2data.size()];
nowAddBoxes();
}
public void nowAddBoxes()
{
java.awt.Component[] comp = this.getComponents();
for(int i=0;i<comp.length;i++){
this.remove(comp[i]);
}
for(int i=0;i<manyboxes.length;i++){
manyboxes[i]=new JCheckBox();
this.add(manyboxes[i]);
manyboxes[i].addMouseListener(this);
}
this.revalidate();
this.repaint();
}
public void mouseClicked(MouseEvent me)
{
String uden="uden ";
String ekstra="ekstra ";
boolean there=false;
if (me.getClickCount()==2)
{
Object source=(Object)me.getComponent();
System.out.println("source ="+source.toString());
int contentStartIndex=(me.toString()).indexOf("text=");
int contentEndIndex=(me.toString()).indexOf(",verticalAlignment");
String theValue=(me.toString()).substring(contentStartIndex+5,contentEndIndex);
System.out.println("the value ="+theValue);
System.out.println("selectedIndex ="+selectedIndex);
boolean checkBoxCheckedValue;
if (boxIsSelected==null)
{
checkBoxCheckedValue=true;
}
else {
checkBoxCheckedValue=boxIsSelected.booleanValue();
}
String udenEkstraValue;
if (checkBoxCheckedValue==true) {
udenEkstraValue="uden "+theValue;
}
else {
udenEkstraValue="ekstra "+theValue;
}
System.out.println("** udenEkstraValue ="+udenEkstraValue);
System.out.println("** getRowCount() ="+billtableModel.getRowCount());
for (int i=0;i<billtableModel.getRowCount();i++) {
System.out.println("there value ="+there);
if (udenEkstraValue.equals(billtableModel.getValueAt(i,1)))
{
there=true;
System.out.println("checkBoxCheckedValue ="+checkBoxCheckedValue);
System.out.println(" IT's THERE ALREADY");
String withX=(String)(billtableModel.getValueAt(i,0)); // the value with X
System.out.println("withX = "+withX);
String withOutX=withX.substring(0,withX.indexOf("X")-1);
System.out.println("withOutX = "+withOutX);
String orderNo=withX.substring(withX.indexOf("X")+1,withX.length());
System.out.println("orderNo = "+orderNo);
Integer amountOrdered=new Integer(withOutX.trim());
int IntAmountOrdered=amountOrdered.intValue();
System.out.println("IntAmountOrdered = "+IntAmountOrdered);
int extraAmountAdded=IntAmountOrdered+1;
System.out.println("extraAmountAdded = "+extraAmountAdded);
String valueToSet=extraAmountAdded+" X"+orderNo;
System.out.println("valueToSet = "+valueToSet);
billtableModel.setValueAt(valueToSet,i,0);//setValueAt(Object value, int row, int column) {
if (checkBoxCheckedValue==false) // an extra amount must be added to the amount
{
billtableModel.setValueAt(new Double(5.0),i,2);
pris+=5.0;
}
totalresultat.setText(pris+" kr");
}
} // for
if (there==false) {
System.out.println(" **--** checkBoxCheckedValue ="+checkBoxCheckedValue);
System.out.println(" IT*S NOT THERE !!");
billtableModel.addTableElement(new TableElement("1 X", udenEkstraValue, new Double(0.0)));
if (checkBoxCheckedValue==false) // an extra amount must be added to the amount
{
billtableModel.setValueAt(new Double(5.0),billtableModel.getRowCount()-1,2);
pris+=5.0;
}
totalresultat.setText(pris+" kr");
}
} // if (me. ...
}// mouseClicked
public void mousePressed(MouseEvent me){}
public void mouseReleased(MouseEvent me){}
public void mouseExited(MouseEvent me)
{
me.getComponent().setForeground(Color.black);
me.getComponent().setFont(ass.normalFont());
}
public void mouseEntered(MouseEvent me)
{
me.getComponent().setForeground(Color.yellow);
me.getComponent().setFont(ass.customFont());
}
public void actionPerformed(ActionEvent ae) {
Object source=(Object)ae.getSource();
for (int i=0;i<manyboxes.length;i++) {
if (source==manyboxes[i])
{
selectedIndex=i;
System.out.println("manyboxes[i].isSelected "+manyboxes[i].isSelected());
boxIsSelected=new Boolean(manyboxes[i].isSelected());
System.out.println("1st time boxIsSelected.booleanValue() ="+boxIsSelected.booleanValue());
}
}
}
}
