Swing ButtonFactory, letzter Button fehlerhaft

Tassimmo

Mitglied
Hallo zusammen,

ich teste grad mal wieder ein bisschen mit Swing rum und versuche, mir ein Raster an Buttons zu erstellen, die alle dieselbe Aktion ausführen sollen. Dazu hab ich eine Methode geschrieben, die diese Buttons erzeugt (noch unaufgeräumt 🙂 ):
Java:
package gui;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JToggleButton;

public class Field {

	private JFrame frame;
	private JToggleButton[][] buttons; 

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Field window = new Field(15,10);
					window.frame.setSize(500,500);
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Field(int pWidth, int pHeigth) 
	{
		initialize();
		buttons = new JToggleButton[pWidth][pHeigth];
		buildButtons(pWidth, pHeigth);
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() 
	{
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	private void buildButtons(int pWidth, int pHeigth)
	{
		Dimension d = new Dimension(frame.getSize().width/pWidth, frame.getSize().height/pHeigth);
		for(int i=0;i<pHeigth;i++)
		{
			final int vertical = i;
			for(int j=0;j<pWidth;j++)
			{
				
				final int horizontal = j;
				
				Point p = new Point((int)d.getWidth()*j,(int)d.getHeight()*i);
				
				buttons[horizontal][vertical] = new JToggleButton();
				
				buttons[horizontal][vertical].setSize(d);
				buttons[horizontal][vertical].setLocation(p);
				
				buttons[horizontal][vertical].addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) 
					{
						buttons[horizontal][vertical].setText("P");
						buttons[horizontal][vertical].setEnabled(false);
					}
				});
				frame.getContentPane().add(buttons[horizontal][vertical]);
				
			}
		}
	}
}

Die Buttons an sich funktionieren zwar, allerdings hab ich zwei Probleme:
1. Die Buttons werden direkt auf das Frame geschrieben, welches ein BorderLayout hat. Allerdings muss ich schauen, dass sich die Größe der Buttons passend zur Fenstergröße verändert.
2. Der letzte Button unten rechts wird nicht dem Raster entsprechend angezeigt, sondern hinter allen anderen und in der kompletten Fenstergröße, und dieser passt sich auch der Fenstergröße an, wenn ich diese verändere.

Ich hab mit dem BorderLayout noch nicht ganz so viel gearbeitet, daher kann es auch sein, dass ich irgendeinen dummen Fehler drin hab, aber ich komm grad einfach nich drauf^^

Bereits vielen Dank im Voraus für eure Antworten.
 

Anhänge

  • border_test.png
    border_test.png
    39,4 KB · Aufrufe: 29
Ich sage dir, dass du lieber mit Layouts arbeiten solltest. Hier hast du dein Beispiel nochmal mit allem, was es haben sollte:

Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;

public class ButtonField {
  public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new ButtonField(10, 15);
      }
    });
  }
  
  public ButtonField(int height, int width) {
    JFrame frame = new JFrame("Buttongrid");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(createButtonGrid(height, width));
    frame.setVisible(true);
    frame.pack();
  }
  
  private JPanel createButtonGrid(int height, int width) {
    JPanel panel = new JPanel(new GridLayout(height, width));
    for (int i = 0; i < height; i++) {
      for (int j = 0; j < width; j++) {
        JToggleButton but = new JToggleButton();
        panel.add(but);
        but.setAction(new PrintAction(i, j));
        but.setText(String.format("[%d, %d]", j, i));
      }
    }
    return panel;
  }
  
  private class PrintAction extends AbstractAction {
    private static final long serialVersionUID = 1L;
    
    private int height, width;
    
    public PrintAction(int height, int width) {
      this.height = height;
      this.width = width;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
      System.out.println(String.format("JToggleButton[x=%d, y=%d]", width, height));
    }
  }
}
 

Zurück
Oben